Python 熊猫用分类数据和大量nan值连接行/groupby

Python 熊猫用分类数据和大量nan值连接行/groupby,python,pandas,pandas-groupby,Python,Pandas,Pandas Groupby,我试图通过基于2列连接行来简化数据帧。现在,剩下的有点混乱,有很多nan值等等。我将展示一个示例: 首字母: Name Sex Shoes Bike Car 0 John Male Specialised 1 John Male Bridgestone 2 Lucy Female BMW 3 J

我试图通过基于2列连接行来简化数据帧。现在,剩下的有点混乱,有很多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个“类别”列……还要注意,每一行应该只有一个“类别”中的字符串——鞋子/自行车/汽车等。)


提前谢谢

您可以使用空字符串
填充na
,然后在最后清除坏数据



正则表达式的顺序是非常重要的,您可以使用下面的组来使用它

df=pd.DataFrame([[John]、[Male]、[na]、[John]、[Male]、[na]、[Bridgestone]、[na]、[Lucy]、[na]、[na]、[na]、[na]、[na]、[na]、[na]、[na]、[na]、[na]、[na]、[na]、[na]、[na]、[na]、[na]、[na]、[na]、[na]
df=df.mask(df==“na”,“”)
df.groupby([“姓名”,“性别]).agg(lambda行:“,”。
联接([val for val in row if val.strip()!=“”])

假设空单元格为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()

这个问题解决得很好,谢谢!你能解释一下嵌套lambda函数是如何工作的吗?我没办法想清楚。别担心:)@veterpargat第一次申请是在每个组上,数据框对应于John/Lucy。这里的x表示数据帧。在每个组中,我们使用了第二个apply,这是一个dataframeapply,它在每个列上应用一个函数。这里,我们将所有非空字符串连接到一列中。总之,我们按名称/性别拆分数据帧,并对每个数据帧应用(第一个)操作。然后在每个数据帧中,我们在每列上应用(第二个)函数
(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()