[英]Pandas Groupby result into a separate dataframe
假设有一个包含 4(或 n)列的 100 条记录的数据框,下面的数据框示例:
id target col3 col4
00 0 .. ..
00 0 .. ..
00 0 .. ..
01 1 .. ..
01 1 .. ..
01 0 .. ..
01 1 .. ..
02 1 .. ..
02 0 .. ..
02 1 .. ..
02 0 .. ..
..
..
基于此数据框,我想创建一个新数据框,它是此数据group_by
上的group_by
和特定列(目标)的value_counts
的结果。
我已经弄清楚如何获取这些值(我当前的代码):
for id, target in df.group_by('id'):
print(id)
print(group.target.value_counts())
这给了我以下输出:
00
0 3
Name: target, dtype: int64
01
0 1
1 3
Name: target, dtype: int64
02
0 2
1 2
Name: target, dtype: int64
..
..
我能够获得这些值,但似乎无法将这些值传递到空数据帧中。 我想创建一个新的数据框,以这种格式表示此信息:
id 0 1
00 3 NaN
01 1 3
02 2 2
..
..
您可以使用'size'
作为 aggfunc 执行简单的.pivot_table()
:
d = {'id': ['00', '00', '00', '01', '01', '01', '01', '02', '02', '02', '02'],
'target': [0, 0, 0, 1, 1, 0, 1, 1, 0, 1, 0]}
df = pd.DataFrame(d)
print( df.pivot_table(columns='target', index='id', aggfunc='size') )
印刷:
target 0 1
id
00 3.0 NaN
01 1.0 3.0
02 2.0 2.0
这是一种方法:
df = (df
.groupby('id')
.apply(lambda f: f['target'].value_counts().to_frame())
.unstack()
.reset_index())
df.columns = ['id', 0, 1]
print(df)
id 0 1
0 0 3.0 NaN
1 1 1.0 3.0
2 2 2.0 2.0
您可以使用 Pandas CrossTab 功能来实现这一点。 Pandas Crosstab 计算表中两个因子之间值的频率。 在这里阅读更多
import pandas as pd
import numpy as np
d = {'id': ['00', '00', '00', '01', '01', '01', '01', '02', '02', '02', '02'],
'target': [0, 0, 0, 1, 1, 0, 1, 1, 0, 1, 0]}
df = pd.DataFrame(d)
print ( pd.crosstab(index=df['id'], columns=df['target']).replace(0, np.nan) )
印刷
target 0 1
id
00 3 0
01 1 3
02 2 2
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.