当前位置: 首页 > 知识库问答 >
问题:

Pandas:在多列上使用字典映射列

汪阳飇
2023-03-14

我有一个数据帧,其中一列中具有“无”值。我想将此 None 值替换为其他列的相同组合的“类别”的最大值。

示例:熊猫数据帧

import pandas as pd
d = {'company': ['Company1', 'Company1', 'Company1', 'Company1', 'Company2', 'Company2'], 'product': ['Product A', 'Product A', 'Product F', 'Product A', 'Product F', 'Product F'], 'category': ['1', None, '3', '2', None, '5']}

df = pd.DataFrame(d)

   company   product       category
0  Company1  Product A        1
1  Company1  Product A     None
2  Company1  Product F        3
3  Company1  Product A        2
4  Company2  Product F     None
5  Company2  Product F        5

我想将3中的值替换为唯一组合(1.2列组)此列的max()值。预期结果如下所示:

   company   product       category
0  Company1  Product A        1
1  Company1  Product A        **2**
2  Company1  Product F        3
3  Company1  Product A        2
4  Company2  Product F        **5**
5  Company2  Product F        5

我尝试过的:我把1。2.列(“公司产品”)获取3的最大值()。列建立一个字典'类别'。(基于GroupBy结果到列表字典的思想)

df_dict = df[~df['category'].isna()].groupby(['company','product'])['category'].max().apply(list).to_dict()

我得到这个判决df_dict(显示每个组合的最大类别值):

{('Company1', 'Product A'): ['2'], ('Company1', 'Product F'): ['1'], ('Company2', 'Product F'): ['5']}

现在我想用字典中每个组合的最大值替换

df[df['category'].isna()]

   ompany    product       category
1  Company1  Product A     None
4  Company2  Product F     None

问题是,我该怎么做?我尝试使用< code>set_index()

df[df['category'].isna()].set_index(['company', 'product']).index

结果

MultiIndex([('Company1', 'Product A'),
        ('Company2', 'Product F')],
       names=['company', 'product'])

这将匹配字典中的条目并将其一起使用map()

    df['category'] = df[df['category'].isna()].set_index(['company', 'product']).in
dex.map(df_dict)

...但是我得到了一个值错误

ValueError: Length of values (2) does not match length of index (6)

共有1个答案

李昌勋
2023-03-14

两个步骤,

首先,将这些 None 值转换为 NaN,以便我们可以使用数值运算。

df['category'] = pd.to_numeric(df['category']) # add arg ,errors='coerce' if needed.

第二,让我们使用groupby transform和max仅填充NaN值。

df["category"] = df["category"].fillna(
    df.groupby(["company", "product"])["category"].transform("max")
)
print(df)

    company    product  category
0  Company1  Product A       1.0
1  Company1  Product A       2.0
2  Company1  Product F       3.0
3  Company1  Product A       2.0
4  Company2  Product F       5.0
5  Company2  Product F       5.0
 类似资料:
  • 问题内容: 使用Spark 1.6,我有一个Spark (命名为),其值分别为A,B,C,DS,DNS,E,F,G和H,我想使用下面的值创建一个新列(例如),我该如何映射?(因此fi’A’需要映射为’S’等。) 问题答案: 使用UDF(与版本无关)的低效率解决方案: 结果: 创建文字的效率更高( Spark > = 2.0,Spark <3.0): 结果相同: 但更有效的执行计划: 与UDF版本相

  • 我有一个类似的例子,类似于我的另一个问题Pandas:在多个列上使用字典映射列,但是现在,我想不直接使用列“category”的max()值,而是间接使用它来填充第四列“category_name”中的None与问题1中的情况相同,但是增加了一个包含字符串的列。 此处“类别”列始终是填充的,而“类别名称”列有一些缺失值: 我想再一次用值填充无/南,我想使用的逻辑是:使用列“类别”中最大值的行的列“

  • 映射或字典类型,一种键值对的映射关系存储结构。定义方式为mapping(_KeyType => _KeyValue)。键的类型允许除映射外的所有类型,如数组,合约,枚举,结构体。值的类型无限制。 映射可以被视作为一个哈希表,其中所有可能的键已被虚拟化的创建,被映射到一个默认值(二进制表示的零)。但在映射表中,我们并不存储键的数据,仅仅存储它的keccak256哈希值,用来查找值时使用。 因此,映射

  • map 翻译过来就是字典或者映射,可以把 map 看做是切片的升级版 切片是用来存储一组相同类型的数据的,map也是用来存储一组相同类型的数据的 在切片中我们可以通过索引获取对应的元素,在 map 中我们可以通过key获取对应的元素 切片的索引是系统自动生成的,从0开始递增,map 中的 key 需要我们自己指定 只要是可以做 ==、!= 判断的数据类型都可以作为 key(数值类型、字符串、数组、

  • 问题 现在有多个字典或者映射,你想将它们从逻辑上合并为一个单一的映射后执行某些操作, 比如查找值或者检查某些键是否存在。 解决方案 假如你有如下两个字典: a = {'x': 1, 'z': 3 } b = {'y': 2, 'z': 4 } 现在假设你必须在两个字典中执行查找操作(比如先从 a 中找,如果找不到再在 b 中找)。 一个非常简单的解决方案就是使用 collections 模块中的

  • 问题内容: 为什么不像? 这是一个尝试使用index.map的小例子: 这引起了 给它喂lambda可以工作: 但是,重置索引和列上的映射可以按预期工作,而不会产生抱怨: 问题答案: 我没有回答您的问题…只是为您提供更好的解决方法。 使用它们