将pandas pivot_table转换为DataFrame

0 投票
2 回答
1004 浏览
提问于 2025-04-18 14:29

我有一些数据,看起来像这样:

from pandas import DataFrame
data = [{'id': 1, 'label': 0, 'code': 'f1'}, {'id': 1, 'label': 0, 'code': 'f2'},
            {'id': 2, 'label': 1, 'code': 'f3'},
            {'id': 2, 'label': 1, 'code': 'f4'}]
df = DataFrame(data)

>>>
    code  id  label
0   f1   1      0
1   f2   1      0
2   f3   2      1
3   f4   2      1

我想把这些数据重新整理成这样(要有合适的标题,并且没有错误的 id-label 关联)。

   id label  f1  f2  f3  f4
    1     0   1   1   0   0
    2     1   0   0   1   1

我试着用 pivot_table,但是整理出来的数据看起来是这样的:

df['val'] = 1
pt_df = df.pivot_table('val', columns='code', index=['id', 'label'], fill_value=0, dropna=False)

>>>
     f1  f2  f3  f4
1 0   1   1   0   0
  1   0   0   0   0
2 0   0   0   0   0
  1   0   0   1   1

如果有任何建议,我会很感激!谢谢!

2 个回答

0

我使用了 unstack,这个操作基本上就是把数据进行透视...

df['vals'] = 1
df = df.set_index(['id' ,'label' ,'code']).unstack('code').fillna(0)
#df = df.reset_index() #to bring out id and label
0

这里有一种方法:

>>> df.pivot_table(columns='code', index=['id', 'label'], aggfunc=len, fill_value=0)
code      f1  f2  f3  f4
id label                
1  0       1   1   0   0
2  1       0   0   1   1

[2 rows x 4 columns]

如果你想要把id/label的信息放在列里,而不是索引中,可以使用 reset_index

你的示例数据集很小,所以不太清楚这种方法是否适合你想要的情况。基本上,这个方法的作用是为每个id/label和code的组合设置一个值,这个值是数据表中有多少行包含这个组合(比如,id=1,label=0,code=f1的值是1,因为只有一行有这些值)。

撰写回答