在一列上进行分组,并在另一列上应用功能,但保留数据框所有其他列的第一个元素

时间:2020-09-18 08:41:18

标签: python pandas dataframe pandas-groupby

这是我的代码:

frst_df = df.drop(columns=["Comment"]).groupby(['source'], as_index=False).agg('first')
cmnt_df = df.groupby(['source'], as_index=False)['Comment'].apply(', '.join)
merge_df = pd.merge(frst_df, cmnt_df , on='source')

我希望这是可以理解的。

我有一个很大的数据框,其中有一列“源”。这是数据框的主要列。现在,对于“评论”列,我想加入与“源”的值相对应的所有评论。数据框中还有大约50个其他列。我只想从与“源”相对应的所有值中只选择第一个元素。

我编写的代码可以正常工作,但是数据框很大,创建两个单独的数据框然后合并它们需要花费大量时间。有什么更好的方法吗?

2 个答案:

答案 0 :(得分:1)

您可以按字典使用GroupBy.agg-所有列仅按Commentjoin的顺序进行汇总:

df = pd.DataFrame({
        'Comment':list('abcdef'),
         'B':[4,5,4,5,5,4],
         'C':[7,8,9,4,2,3],
         'D':[1,3,5,7,1,0],
         'E':[5,3,6,9,2,4],
         'source':list('aaabbc')
})

d = dict.fromkeys(df.columns.difference(['source']), 'first')
d['Comment'] = ', '.join

merge_df = df.groupby('source', as_index=False).agg(d)
print (merge_df)
  source  B  C  Comment  D  E
0      a  4  7  a, b, c  1  5
1      b  5  4     d, e  7  9
2      c  4  3        f  0  4

答案 1 :(得分:0)

这是另一种可能的解决方案。

df['Comment'] = df.groupby('source')['Comment'].transform(lambda x: ','.join(x))
df = df.groupby('source').first()