如何用数据帧生成透视表?

2024-10-06 10:21:36 发布

您现在位置:Python中文网/ 问答频道 /正文

我有这样一个数据帧:

>>> df = pd.DataFrame( {'level01': [10, 20, 20, 30, 40, 50, 60], 'level02': [110, 210, 150, 310, 410, 510, 610], 'value01': [1, 0, 0, 2, 0, 0, 3], 'value02': [0, 3, 0, 1, 0, 0, 1]} )

>>> df
   level01  level02  value01  value02
0       10      110        1        0
1       20      210        0        3
2       20      150        0        0
3       30      310        2        1
4       40      410        0        0
5       50      510        0        0
6       60      610        3        1

每个值列对应于它的级别列。例如,df['value01'][0],即1,表示级别df['level01'][0],即10的值。(级别10的值为1)

我想提取0的每个值行及其级别,并生成一个透视表。结果是:

   level, value
0     20      2
1     40      1
2     50      1
3    110      1
4    150      1
5    410      1
6    510      1

我试过df.pivot_table( values=df[['value01', 'value02']], index=df[['level01', 'level02']], aggfunc='count'),但结果与我的想法大不相同

                value01  value02
level01 level02                  
10      110            1        1
20      150            1        1
        210            1        1
30      310            1        1
40      410            1        1
50      510            1        1
60      610            1        1

我怎样才能得到我想要的结果?如果我能得到一些帮助我会很感激的


Tags: 数据dataframedfindexvaluetable级别level
1条回答
网友
1楼 · 发布于 2024-10-06 10:21:36

在列中创建MultiIndex,按^{}重塑形状,因此可能只按^{}过滤0值,按^{}过滤每个组的最后一次获取计数:

s = df.columns.to_series()
df.columns = pd.MultiIndex.from_arrays(list(zip(*s.str.extract('(\D+)(\d+)').values.tolist())))
df2 = (df.stack()
         .query('value == 0')
         .groupby('level')
         .size()
         .reset_index(name='value'))

print (df2)
   level  value
0     20      2
1     40      1
2     50      1
3    110      1
4    150      1
5    410      1
6    510      1

如果在第一步中只有2列是create helper DataFramewith ^{},则解决方法是:

df1 = pd.DataFrame({'level': df[['level01', 'level02']].values.ravel(),
                   'value': df[['value01', 'value02']].values.ravel()})

df2 = (df1.query('value == 0')
          .groupby('level')
          .size()
          .reset_index(name='value'))

相关问题 更多 >