Py学习  »  Python

在python pandas中,将group by之后的列的多个值合并为一列

H_A • 5 年前 • 3514 次点击  

我希望完成与此线程中类似的任务: Merge multiple column values into one column in python pandas

但不同的是,我希望创建一个新列,在按其他列分组后合并列中的所有非空值。下面是一个玩具示例:

df= pd.DataFrame({'ID1' : [1,1,2,2,3,3,3],'ID2' : ['a','a','b','b','c','c','c'],
             'Status' : pd.Series([np.nan,'1', np.nan,'1','2',np.nan,'1'], 
                                  dtype="category")})

 df
Out[74]: 
     ID1 ID2 Status
 0    1   a    NaN
 1    1   a      1
 2    2   b    NaN
 3    2   b      1
 4    3   c      2
 5    3   c    NaN
 6    3   c      1

然后我想 groupby ID1 ID2 :

gr = df.groupby(['ID1','ID2'])

然后,我希望我的结果是这样的:

Out:
   NewCol
0   1
1   1
2   2,1

DataFrame 包含 non-null Status 列分组依据 ID2号

提前谢谢。

Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/56566
 
3514 次点击  
文章 [ 1 ]  |  最新文章 5 年前
jezrael
Reply   •   1 楼
jezrael    5 年前

使用 GroupBy.agg 使用lambda函数是最普遍的解决方案:

df1 = df.groupby(['ID1','ID2'])['Status'].agg(lambda x: ','.join(x.dropna())).reset_index()
print (df1)
   ID1 ID2 Status
0    1   a      1
1    2   b      1
2    3   c    2,1

另一个想法是在第一步中删除重复项,但是如果某个组只有错误的值,那么它将从输出中删除,因此有必要进行如下处理 merge

#first group with only NaNs
df= pd.DataFrame({'ID1' : [1,1,2,2,3,3,3],'ID2' : ['a','a','b','b','c','c','c'],
             'Status' : pd.Series([np.nan,np.nan, np.nan,'1','2',np.nan,'1'], 
                                  dtype="category")})


#first group is dropped
df11 = (df.dropna(subset=['Status'])
          .groupby(['ID1','ID2'])['Status']
          .agg(','.join)
          .reset_index())
print (df11)
   ID1 ID2 Status
0    2   b      1
1    3   c    2,1

#added missing pairs and `NaN`s converted to empty strings:
df2 = df.drop_duplicates(['ID1','ID2'])[['ID1','ID2']].merge(df11, how='left').fillna('')
print (df2)
   ID1 ID2 Status
0    1   a       
1    2   b      1
2    3   c    2,1

第一种解决方案:

df1 = df.groupby(['ID1','ID2'])['Status'].agg(lambda x: ','.join(x.dropna())).reset_index()
print (df1)
   ID1 ID2 Status
0    1   a       
1    2   b      1
2    3   c    2,1