Python 熊猫:在多个列上使用字典映射列
我有一个数据框,在一列中有Python 熊猫:在多个列上使用字典映射列,python,pandas,pandas-groupby,Python,Pandas,Pandas Groupby,我有一个数据框,在一列中有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'
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的最大值()。列+构建字典“类别”。(基于
我得到这个dictdf_dict
(显示每个组合的最大类别值):
现在,我想将None
替换为我的数据字典中每个组合的最大值
df[df['category'].isna()]
ompany product category
1 Company1 Product A None
4 Company2 Product F None
问题是,我该怎么做?
我尝试了set\u index()
导致
MultiIndex([('Company1', 'Product A'),
('Company2', 'Product F')],
names=['company', 'product'])
这将适合字典中的条目并将其一起使用map()
。。。但我有一个错误
ValueError: Length of values (2) does not match length of index (6)
两步走,
首先,让我们将那些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
非常好的问题,顺便说一句,有一个很好的例子。谢谢你的回答和帮助。它解决了这个问题+1我有另一张几乎相同的问题。但是还有一个带字符串的柱。我将把这个案例添加到顶部的问题中。
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)
df['category'] = pd.to_numeric(df['category']) # add arg ,errors='coerce' if needed.
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