使用pandas GroupBy聚合字符串列

时间:2018-05-15 19:27:30

标签: python string pandas dataframe group-by

我有一个DF,如下所示:

df =

vid   pos      value       sente
1     a         A           21
2     b         B           21
3     b         A           21
3     a         A           21
1     d         B           22
1     a         C           22
1     a         D           22
2     b         A           22
3     a         A           22

现在,我想将sentevid的相同值的所有行合并为一行,value的值加上" "

df2 =

vid   pos      value       sente
1     a         A           21
2     b         B           21
3     b a       A A         21
1     d a a     B C D       22
2     b         A           22
3     a         A           22

我认为对此进行修改应该可以解决问题:

df2 = df.groupby["sente"].agg(lambda x: " ".join(x))

但我似乎无法弄清楚如何将第二列添加到语句中。

2 个答案:

答案 0 :(得分:6)

石斑鱼可以作为列表传递。此外,您可以通过消除lambda的代码来简化您的解决方案 - 它不是必需的。

df.groupby(['vid', 'sente'], as_index=False, sort=False).agg(' '.join)

   vid  sente    pos  value
0    1     21      a      A
1    2     21      b      B
2    3     21    b a    A A
3    1     22  d a a  B C D
4    2     22      b      A
5    3     22      a      A

其他一些注意事项:指定 as_index=False 意味着您的分组器将作为结果中的列出现(而不是作为索引,默认情况下)。此外, sort=False 将保留列的原始顺序。

答案 1 :(得分:1)

在编辑中,@cᴏʟᴅsᴘᴇᴇᴅ的回答更好。

有趣的方式!仅适用于单个字符值

df.set_index(['sente', 'vid']).sum(level=[0, 1]).applymap(' '.join).reset_index()


   sente  vid    pos  value
0     21    1      a      A
1     21    2      b      B
2     21    3    b a    A A
3     22    1  d a a  B C D
4     22    2      b      A
5     22    3      a      A

有点可以回答

df.set_index(['sente', 'vid']).groupby(level=[0, 1]).apply(
    lambda d: pd.Series(d.to_dict('l')).str.join(' ')
).reset_index()

   sente  vid    pos  value
0     21    1      a      A
1     21    2      b      B
2     21    3    b a    A A
3     22    1  d a a  B C D
4     22    2      b      A
5     22    3      a      A

不推荐

df.set_index(['sente', 'vid']).add(' ') \
  .sum(level=[0, 1]).applymap(str.strip).reset_index()

   sente  vid    pos  value
0     21    1      a      A
1     21    2      b      B
2     21    3    b a    A A
3     22    1  d a a  B C D
4     22    2      b      A
5     22    3      a      A