我想在基于col1的熊猫分组后,将col2的value_counts中的值返回到原始数据帧。
即我有...
col1 col2
0 1111 A
1 1111 B
2 1111 B
3 1111 B
4 1111 C
5 2222 A
6 2222 B
7 2222 C
8 2222 C
我想...
col1 col2 col3
0 1111 A 1
1 1111 B 3
2 1111 B 3
3 1111 B 3
4 1111 C 1
5 2222 A 1
6 2222 B 1
7 2222 C 2
8 2222 C 2
我可以使用groupby来获取col3的值,然后将col2的值传递给value_counts,但是我不确定如何将其返回到数据帧中。
示例:
d1 = {'col1': ['1111', '1111', '1111', '1111', '1111', '2222', '2222', '2222', '2222'],
'col2': ['A', 'B', 'B', 'B', 'C', 'A', 'B', 'C', 'C']}
df1 = pd.DataFrame(data=d1)
d2 = {'col1': ['1111', '1111', '1111', '1111', '1111', '2222', '2222', '2222', '2222'],
'col2': ['A', 'B', 'B', 'B', 'C', 'A', 'B', 'C', 'C'],
'col3': [1, 3, 3, 3, 1, 1, 1, 2, 2]}
df2 = pd.DataFrame(data=d2)
print(df1)
print(df2)
counts = df1.groupby('col1').apply(lambda x: x.col2.value_counts()[x.col2])
print(counts)
您可以通过groupby
和transform
进行设置。
df['col3'] = df1.groupby(['col1','col2'])['col2'].transform('count')
print(df)
col1 col2 col3
0 1111 A 1
1 1111 B 3
2 1111 B 3
3 1111 B 3
4 1111 C 1
5 2222 A 1
6 2222 B 1
7 2222 C 2
8 2222 C 2
我不确定这是否是最佳选择,但这是我的努力。用.transform('count')
读取@Terry的评论让我觉得自己喜欢用手指数数:
import pandas as pd
d1 = {'col1': ['1111', '1111', '1111', '1111', '1111', '2222', '2222', '2222', '2222'],
'col2': ['A', 'B', 'B', 'B', 'C', 'A', 'B', 'C', 'C']}
df1 = pd.DataFrame(data=d1)
df_aux = df1.groupby(['col1','col2'])['col1'].count().rename(columns={0:'col3'})
df_aux = df_aux.reset_index()
df_output = df1.merge(df_aux.rename(columns={df_aux.columns[2]:'col3'}),how='left',on=['col1','col2'])
print(df_output)
输出:
col1 col2 col3
0 1111 A 1
1 1111 B 3
2 1111 B 3
3 1111 B 3
4 1111 C 1
5 2222 A 1
6 2222 B 1
7 2222 C 2
8 2222 C 2