繁体   English   中英

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

[英]Groupby on a column and apply function on another column but keep first element of all other columns of dataframe

这是我的代码:

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 个其他列。 我只想从与“源”对应的所有值中选择第一个元素。

我写的代码工作正常,但数据框很大,创建两个单独的数据框然后合并它们需要很多时间。 有没有更好的方法来做到这一点?

您可以通过字典使用GroupBy.agg - 所有列都通过第一个仅通过join Comment聚合:

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM