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

2024-05-26 21:53:34 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个数据帧,在一列中有None个值。对于其他列的相同组合,我想用“category”的最大值替换这个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中的None值。列,该列的最大()值用于唯一组合(1.+2.列组成的组)。 预期结果如下所示:

   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 results to dictionary of lists的想法)

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

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

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

现在,我想用我的Dconditional中每个组合的最大值替换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()

    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)

Tags: of数据nonedfindexproductdictcompany
1条回答
网友
1楼 · 发布于 2024-05-26 21:53:34

两步走,

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

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

相关问题 更多 >

    热门问题