熊猫:在多列上使用字典映射列

时间:2020-08-06 09:38:00

标签: python pandas pandas-groupby

我有一列具有false值的数据框。对于其他列的相同组合,我想用“类别”的最大值替换此None值。

示例:熊猫数据框

None

我想将3.列中的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 值替换为该列的max()值以获得唯一组合(1. + 2.列的组)。 预期结果将如下所示:

None

我尝试过的方法: 我已经将1. + 2.列(“公司+产品”)分组了,并获得了3.列的max()+构建了一个字典“ category”。 (基于GroupBy results to dictionary of lists的想法)

   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

我得到这个字典df_dict = df[~df['category'].isna()].groupby(['company','product'])['category'].max().apply(list).to_dict() (显示每个组合的最大类别值):

df_dict

现在,我想用dcition中每个组合的最大值替换{('Company1', 'Product A'): ['2'], ('Company1', 'Product F'): ['1'], ('Company2', 'Product F'): ['5']}

None

问题,我该怎么办? 我尝试了df[df['category'].isna()] ompany product category 1 Company1 Product A None 4 Company2 Product F None

set_index()

产生

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

这将适合字典中的条目并将其MultiIndex([('Company1', 'Product A'), ('Company2', 'Product F')], names=['company', 'product']) 一起使用

map()

...但是我收到ValueError

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

1 个答案:

答案 0 :(得分:2)

两步,

首先让我们将这些None值设为NaNs,以便我们可以使用数字运算。

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

2,让我们使用groupby变换和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