pandas使用分类数据和大量nan值连接rows/groupby

2024-06-06 14:12:05 发布

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

我试图通过基于两列连接行来简化数据帧。现在,剩下的有点乱,有很多nan值之类的。我将举一个例子:

首字母:

    Name    Sex     Shoes       Bike          Car
0   John    Male             Specialised    
1   John    Male             Bridgestone    
2   Lucy    Female                            BMW
3   John    Male    Vans        
4   Lucy    Female  Nike    

目标:

    Name    Sex     Shoes   Bike                        Car
0   John    Male    Vans    Specialised, Bridgestone    
1   Lucy    Female  Nike                                BMW

我应该使用什么功能?我不知道如何使用groupby.agg(','.join)加法。。。你知道吗

(上面的数据只是示例性的——我必须处理的数据有更多的行,其中有许多相同名称的出现,还有大约20个‘category’列。。。还要注意的是,每一行只能有一个“类别”中的字符串(鞋子/自行车/汽车等)

提前谢谢!你知道吗


Tags: 数据namejohncarmalefemalebikenike
3条回答

您可以使用空字符串fillna,然后在末尾清除坏数据。你知道吗


u = df.fillna('').groupby(['Name', 'Sex']).agg(', '.join)
u.stack().str.replace('(, ){2,}|^, |, $', '').unstack()

            Shoes                      Bike  Car
Name Sex
John Male    Vans  Specialised, Bridgestone
Lucy Female  Nike                            BMW

正则表达式的顺序非常重要

假设空单元格为NaN(非空字符串),则以下操作将获得结果

(df.set_index(['Name','Sex']) 
   .groupby(level=[0,1])
   .apply(lambda x:x.apply(lambda y: ', '.join(y.dropna())))
   .reset_index())

第二种方法

(df.set_index(['Name','Sex'])
   .stack()
   .groupby(level=[0,1,2])
   .apply(', '.join)
   .unstack()
   .reset_index()

您可以通过如下方式使用此组

df = pd.DataFrame([['John', 'Male', 'na', 'Specialised', 'na'], ['John', 'Male', 'na', 'Bridgestone', 'na'], ['Lucy', 'Female', 'na', 'na', 'BMW'], ['John', 'Male', 'Vans', 'na', 'na'], ['Lucy', 'Female', 'Nike', 'na', 'na']], columns=('Name', 'Sex', 'Shoes', 'Bike', 'Car'))
df = df.mask(df == "na", '')

df.groupby(["Name", "Sex"]).agg(lambda row: ",".
                                join([val for val in row if val.strip()!=""]))

相关问题 更多 >