【问题标题】:New column in pandas - adding series to dataframe by applying a list groupbypandas 中的新列 - 通过应用列表 groupby 将系列添加到数据框
【发布时间】:2017-03-18 21:18:37
【问题描述】:

给下面df

  Id other  concat
0  A     z       1
1  A     y       2
2  B     x       3
3  B     w       4
4  B     v       5
5  B     u       6

我想要new 列的结果,并将分组值作为列表

  Id other  concat           new
0  A     z       1        [1, 2]
1  A     y       2        [1, 2]
2  B     x       3  [3, 4, 5, 6]
3  B     w       4  [3, 4, 5, 6]
4  B     v       5  [3, 4, 5, 6]
5  B     u       6  [3, 4, 5, 6]

这类似于这些问题:

grouping rows in list in pandas groupby

Replicating GROUP_CONCAT for pandas.DataFrame

但是,它将您从df.groupby('Id')['concat'].apply(list)(比数据框更小的Series)获得的分组应用于原始数据框。

我已经尝试了下面的代码,但它不适用于数据框:

import pandas as pd
df = pd.DataFrame( {'Id':['A','A','B','B','B','C'], 'other':['z','y','x','w','v','u'], 'concat':[1,2,5,5,4,6]})
df.groupby('Id')['concat'].apply(list)

我知道transform 可用于将分组应用于数据帧,但在这种情况下不起作用。

>>> df['new_col'] = df.groupby('Id')['concat'].transform(list)
>>> df
  Id  concat other  new_col
0  A       1     z        1
1  A       2     y        2
2  B       5     x        5
3  B       5     w        5
4  B       4     v        4
5  C       6     u        6
>>> df['new_col'] = df.groupby('Id')['concat'].apply(list)
>>> df
  Id  concat other new_col
0  A       1     z     NaN
1  A       2     y     NaN
2  B       5     x     NaN
3  B       5     w     NaN
4  B       4     v     NaN
5  C       6     u     NaN

【问题讨论】:

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


    【解决方案1】:

    groupbyjoin

    df.join(df.groupby('Id').concat.apply(list).to_frame('new'), on='Id')
    

    【讨论】:

      【解决方案2】:

      不太优雅(而且速度较慢..)的解决方案,但将其作为替代方案。

      def func(gr):
          gr['new'] = [list(gr.concat)] * len(gr.index)
          return gr
      df.groupby('Id').apply(func)
      
      %timeit df.groupby('Id').apply(func)
      100 loops, best of 3: 4.18 ms per loop
      
      %timeit df.join(df.groupby('Id').concat.apply(list).to_frame('new'), on='Id')
      1000 loops, best of 3: 1.69 ms per loop
      

      【讨论】:

        【解决方案3】:

        transform[x.tolist()][x.values] 一起使用

        In [1396]: df.groupby('Id')['concat'].transform(lambda x: [x.tolist()])
        Out[1396]:
        0          [1, 2]
        1          [1, 2]
        2    [3, 4, 5, 6]
        3    [3, 4, 5, 6]
        4    [3, 4, 5, 6]
        5    [3, 4, 5, 6]
        Name: concat, dtype: object
        
        In [1397]: df['new'] = df.groupby('Id')['concat'].transform(lambda x: [x.tolist()])
        
        In [1398]: df
        Out[1398]:
          Id other  concat           new
        0  A     z       1        [1, 2]
        1  A     y       2        [1, 2]
        2  B     x       3  [3, 4, 5, 6]
        3  B     w       4  [3, 4, 5, 6]
        4  B     v       5  [3, 4, 5, 6]
        5  B     u       6  [3, 4, 5, 6]
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2020-07-14
          • 2017-05-02
          • 2017-12-20
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2021-02-01
          • 2016-09-08
          相关资源
          最近更新 更多