【问题标题】:Aggregating string columns using pandas GroupBy使用 pandas GroupBy 聚合字符串列
【发布时间】:2018-05-15 19:27:29
【问题描述】:

我有一个 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

现在我想将具有相同 sente 和 vid 值的所有行合并为一行,其中 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))

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

【问题讨论】:

    标签: python pandas dataframe group-by pandas-groupby


    【解决方案1】:

    Groupers 可以作为列表传递。此外,您可以通过去掉 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 将保留列的原始顺序。

    【讨论】:

      【解决方案2】:

      截至本次编辑,@cᴏʟᴅsᴘᴇᴇᴅ 的回答要好得多。

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

      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
      

      【讨论】:

      • 喜欢你所说的“不推荐”,但无论如何都要发帖:D
      • 老实说,我认为通过折腾可以学到很多东西。
      猜你喜欢
      • 2021-11-01
      • 2019-10-12
      • 2017-07-02
      • 2017-07-20
      • 1970-01-01
      • 2017-06-07
      • 2019-12-22
      • 1970-01-01
      • 2014-11-23
      相关资源
      最近更新 更多