熊猫:使用其他列的max()值映射列

时间:2020-08-10 07:40:54

标签: python pandas pandas-groupby

我有类似的情况,就像我的其他问题Pandas: map column using a dictionary on multiple columns 但是现在,我不想直接使用“类别”列的max()值,而是间接使用第四列“ category_name”中的“无” 与问题1中的情况相同,只是另外一列包含字符串。

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

df = pd.DataFrame(f)

此处始终填充“类别”列,而“类别名称”列缺少一些值:

   company   product     category      category_name
0  Company1  Product A        1             a
1  Company1  Product A        1          None
2  Company1  Product F        3             b
3  Company1  Product A        2             c
4  Company2  Product F        3          None
5  Company2  Product F        5             d

再次,我想用值填充None / Nan,然后再次使用以下逻辑:将行的列“ category_name”与列“ category”中的最大值一起用作列1的组合。+ 2。

希望的结果是:

   company   product     category      category_name
0  Company1  Product A        1             a
1  Company1  Product A        1           **c**
2  Company1  Product F        3             b
3  Company1  Product A        2             c
4  Company2  Product F        3           **d**
5  Company2  Product F        5             d

->组合“ company1” +“产品A”的max(category)= 3->因此,对“类别名称”列中第1行的缺失值使用“ c”。

对此我也非常感谢。 非常感谢

2 个答案:

答案 0 :(得分:0)

category_name使用Series.idxmax的自定义函数,最大使用category

df['category'] = df['category'].astype(int)

def f(x):
    s = x.set_index('category_name')['category'].idxmax()
    x['category_name'] = x['category_name'].fillna(s)
    return x

df = df.groupby(['company','product']).apply(f)
print (df)
    company    product  category category_name
0  Company1  Product A         1             a
1  Company1  Product A         1             c
2  Company1  Product F         3             b
3  Company1  Product A         2             c
4  Company2  Product F         3             d
5  Company2  Product F         5             d

答案 1 :(得分:0)

   `
def fnx(x):
    m=x["category"].max() 
    val=x[x["category"]==m][" 
    category_name"].values
    x["category_name"].fillna(val[0], in 
    place=True) 
    return x
df = df.groupby(['company','product']).apply(fnx)
`