pandas如何使用转置将数据帧转换为矩阵

时间:2018-04-16 10:34:05

标签: python-3.x pandas numpy dataframe

我有以下df

code    y_m        count
101     2017-11    86
101     2017-12    32
102     2017-11    11
102     2017-12    34
102     2018-01    46
103     2017-11    56
103     2017-12    89

现在我想将此df转换为将列y_m转换为行的矩阵,将count作为矩阵单元格值,例如,

     0     1     2             3             4 
 0   -1    0    2017-11       2017-12       2018-01
 1   0    354   153           155           46
 2   101  118   86            32            -1
 3   102   91   11            34            46
 4   103  145   -1            89            -1

具体而言,-1表示一个虚拟值,表示某个y_m的{​​{1}}值不存在或维持矩阵形状; code代表所有'聚合0codey_mcode的值,例如单元格y_m汇总所有(1, 1)count的{​​{1}}值; y_mcode的{​​{1}}求和。

1 个答案:

答案 0 :(得分:1)

您可以先使用pivot_table

df1 = (df.pivot_table(index='code',
                      columns='y_m',
                      values='count', 
                      margins=True, 
                      aggfunc='sum', 
                      fill_value=-1, 
                      margins_name='0'))
print (df1)
y_m   2017-11  2017-12  2018-01    0
code                                
101        86       32       -1  118
102        11       34       46   91
103        56       89       -1  145
0         153      155       46  354

然后是最终格式,但得到混合值,带字符串的数字:

#change order of index and columns values for reindex
idx = df1.index[-1:].tolist() + df1.index[:-1].tolist()
cols = df1.columns[-1:].tolist() + df1.columns[:-1].tolist()

df2 = (df1.reindex(index=idx, columns=cols)
         .reset_index()
         .rename(columns={'code':-1})
         .rename_axis(None,1))
#add columns to first row
df3 = df2.columns.to_frame().T.append(df2).reset_index(drop=True)
#reset columns names to range
df3.columns = range(len(df3.columns))
print (df3)
     0    1        2        3        4
0   -1    0  2017-11  2017-12  2018-01
1    0  354      153      155       46
2  101  118       86       32       -1
3  102   91       11       34       46
4  103  145       56       89       -1