繁体   English   中英

Pandas Groupby 生成一个单独的数据帧

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM