如何在列参数超过一列的大熊猫中进行转播

时间:2019-04-09 09:12:21

标签: python python-3.x pandas dcast

我有以下dataframe

import pandas as pd
df = pd.DataFrame({'id':[1,2,3,4,5,6], 'id_2':[6,5,4,3,2,1],
'col_1':['A','A','A','B','B','B'],
'col_2':['X','Z','X','Z','X','Z'],
'value':[10,20,30,40,50,60]})

我想dcast,所以我用

df= df.pivot_table(index=['id','id_2'], columns=['col_1', 'col_2'],aggfunc=lambda x: x)

我不知道如何droplevel并将df.columns更改为A_X,A_Z,B_X,B_Zmulti-index使我感到困惑

有什么想法吗?

更新

我想结束

import numpy as np

df=pd.DataFrame({'id':[1,2,3,4,5,6], 'id_2':[6,5,4,3,2,1],
'A_X':[10,np.nan,30,np.nan,np.nan,np.nan],
'A_Z':[np.nan,20,np.nan,np.nan,np.nan,np.nan],
'B_X':[np.nan,np.nan,np.nan,np.nan,50,np.nan],
'B_Z':[np.nan,np.nan,np.nan,40,np.nan,60]})

2 个答案:

答案 0 :(得分:3)

您需要通过Index.droplevel或具有列表理解力,从{ "eno1": { "ip_address": "10.153.243.19", "prefix": 24, "mac": "c8:1f:66:b7:f9:0c", "state": "UP" }, "eno2": { "ip_address": "NULL", "prefix": 0, "mac": "c8:1f:66:b7:f9:0d", "state": "DOWN" } } 删除顶级value

Multiindex

或者:

print (df.columns)
MultiIndex(levels=[['value'], ['A', 'B'], ['X', 'Z']],
           codes=[[0, 0, 0, 0], [0, 0, 1, 1], [0, 1, 0, 1]],
           names=[None, 'col_1', 'col_2'])

df.columns = df.columns.droplevel(0).map('_'.join)

df.columns = [f'{b}_{c}' for a,b,c in df.columns]

另一种解决方案是在df = df.reset_index() print (df) id id_2 A_X A_Z B_X B_Z 0 1 6 10.0 NaN NaN NaN 1 2 5 NaN 20.0 NaN NaN 2 3 4 30.0 NaN NaN NaN 3 4 3 NaN NaN NaN 40.0 4 5 2 NaN NaN 50.0 NaN 5 6 1 NaN NaN NaN 60.0 中指定value参数:

pivot_table

答案 1 :(得分:2)

df2 = (df.pivot_table(index=['id','id_2'], columns=['col_1', 'col_2'],
                         values='value')
            .reset_index()
        )

输出:

    id  id_2    A   B
                X   Z   X   Z
0   1   6   10.0    NaN NaN  NaN
1   2   5   NaN    20.0 NaN  NaN
2   3   4   30.0    NaN NaN  NaN
3   4   3   NaN    NaN  NaN  40.0
4   5   2   NaN    NaN  50.0 NaN
5   6   1   NaN    NaN  NaN  60.0