pandas的新栏目--通过应用列表groupby将系列添加到数据框中[英] New column in pandas - adding series to dataframe by applying a list groupby

本文是小编为大家收集整理的关于pandas的新栏目--通过应用列表groupby将系列添加到数据框中的处理方法,想解了pandas的新栏目--通过应用列表groupby将系列添加到数据框中的问题怎么解决?pandas的新栏目--通过应用列表groupby将系列添加到数据框中问题的解决办法?那么可以参考本文帮助大家快速定位并解决问题。

问题描述

给出以下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列,分组值为list

  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]

这与这些问题相似:

pandas groupby中的列表中的排行行

for pandas.dataframe

但是,它应用了您从df.groupby('Id')['concat'].apply(list)获得的分组,该分组比dataframe小的Series Series应用于原始dataFrame.

我尝试了以下代码,但它不适用于数据框架:

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

推荐答案

groupby join

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

在此处输入图像说明

其他推荐答案

较不优雅(和较慢的)解决方案,但让它作为替代方案.

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

其他推荐答案

使用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]

本文地址:https://www.itbaoku.cn/post/1727906.html