Groupby在一列上,apply函数在另一列上,但保留dataframe所有其他列的第一个元素

2024-09-24 02:25:02 发布

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

这是我的代码:

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')

我希望我在这里所做的一切是可以理解的

我有一个很大的数据框,其中有一列“source”。这是数据帧的主列。现在对于“Comment”列,我想加入与“source”值对应的所有注释。数据框中还有大约50个其他列。我只想从与“源”对应的所有值中选取第一个元素

我编写的代码工作得很好,但是数据帧非常庞大,创建两个单独的数据帧然后合并它们需要很多时间。有没有更好的办法


Tags: columns数据代码falsesourcedfindexas
2条回答

这是另一种可能的解决办法

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

您可以使用^{}by dictionary-所有列仅通过Commentby join聚合:

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

相关问题 更多 >