pandas 中的新列 - 通过应用列表 groupby 将系列添加到数据框
New column in pandas - adding series to dataframe by applying a list 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
列的结果,分组值作为列表
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
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]
给出以下内容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
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]