首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用熊猫GroupBy聚合字符串列

使用熊猫GroupBy聚合字符串列
EN

Stack Overflow用户
提问于 2018-05-15 19:27:29
回答 2查看 9.6K关注 0票数 5

我有如下所示的DF:

代码语言:javascript
复制
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值。

代码语言:javascript
复制
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

我认为对此进行修改就能达到目的:

代码语言:javascript
复制
df2 = df.groupby["sente"].agg(lambda x: " ".join(x))

但我似乎不知道如何将第二列添加到语句中。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-05-15 19:29:35

石斑鱼可以作为名单传递。此外,您可以通过去掉lambda代码来稍微简化您的解决方案--这是不需要的。

代码语言:javascript
复制
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将保留列的原始顺序。

票数 7
EN

Stack Overflow用户

发布于 2018-05-15 19:50:03

对于这个编辑,@cᴏʟᴅ的ᴘᴇᴇᴅ的答案要好得多。

有趣的方式!因为单个char值才有效

代码语言:javascript
复制
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

有点好的答案

代码语言:javascript
复制
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

不建议

代码语言:javascript
复制
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
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50357837

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档