以不区分大小写的字母顺序旋转(重塑)熊猫数据框

时间:2019-04-15 23:18:57

标签: python pandas dataframe pivot-table reshape

我有一个包含3列的数据框:variable1,variable2,value。 值是从变量1和变量2的所有可能组合(全部反对全部)中测得的。另外,变量1和变量2具有相同的名称。当使用内置的数据透视功能重塑数据框时,这并不是按一定顺序进行的。

这是我原始数据框的样子:

var1 var2   value
A   A   0,00016
A   B   0,02848
A   C   0,00028
A   D   0,0028
A   E   0,00012
A   F   0,00092
A   G   0,08612
A   H   0,00704
B   B   0,00364
B   C   2,27228
B   D   0,00244
B   E   0,00136
B   F   0,00024
B   G   0,00504
B   H   1,08716
C   C   0,00032
C   D   4,0033
C   E   0,00024
C   F   0,00012
C   G   0
C   H   0,00592
D   D   0,01288
D   E   0,00268
D   F   0,00644
D   G   0,00012
D   H   5,57488
E   E   0,00048
E   F   0,00012
E   G   0,0886
E   H   0,01948
F   F   0,00016
F   G   0,00188
F   H   0,0212
G   G   0,0014
G   H   0,00244
H   H   0,00092

我尝试在重新生成表格后对其重新排序,但这不能解决问题,因为它的生成顺序不正确。

这是我生成整形数据框的方式:

df = pd.read_csv("results.csv", sep = ";")
# sort names case-insensitive
columns = sorted(df['var1'].unique(), key=lambda s: s.casefold())
pivot = pd.pivot_table(df, values = "value", index = ["var1"], columns = "var2")
pivot = pivot.reindex_axis(columns, axis = 1)
pivot = pivot.reindex_axis(columns, axis = 0)

这会生成如下内容:

var1    A   B   C   D   E   F   G   H
A   0,00016 0,02848 0,00028 0,0028  0,00012 0,00092 0,08612 0,00704
B       0,00364     0,00244     0,00024     1,08716 
C       2,27228 0,00032 4,00E-05    0,00024 0,00012 0   0,00592
D               0,01288     0,00644     5,57488 
E       0,00136     0,00268 0,00048 0,00012 0,0886  0,01948
F                       0,00016     0,0212  
G       0,00504     0,00012     0,00188 0,0014  0,00244
H                               0,00092 

这是我尝试在生成它后对其重新排序的方法,但是由于重新成形的数据帧以错误的顺序生成,因此无法解决问题。因此,这是没有用的,因为不遵守字母顺序。

pivot['Total'] = pivot.count(axis = 1)
pivot = pivot.sort_values(by= "Total" , ascending = False)
pivot = pivot.drop(columns = ["Total"])
pivot.loc['Total']= pivot.count()
pivot = pivot.sort_values(by = "Total", axis = 1, ascending = False)
pivot = pivot.drop(index = ["Total"])

但是,我希望这样使我的数据框对称:

var1    A   B   C   D   E   F   G   H
A   0,00016 0,02848 0,00028 0,0028  0,00012 0,00092 0,08612 0,00704
B       0,00364 2,27228 0,00244 0,00136 0,00024 0,00504 1,08716 
C           0,00032 4,0033  0,00024 0,00012 0   0,00592
D               0,01288 0,00268 0,00644 0,00012 5,57488 
E                   0,00048 0,00012 0,0886  0,01948
F                       0,00016 0,00188 0,0212  
G                           0,0014  0,00244
H                               0,00092 

(格式化在编辑器中看起来不错,但无法正确显示。希望您能理解这一点。)

1 个答案:

答案 0 :(得分:0)

如果我对您的理解正确。

result = pd.pivot_table(df, values='value', index='var1',
                        columns='var2', aggfunc=lambda x: x)

result.fillna('')

var2        A        B        C        D        E        F        G        H
var1                                                                        
A     0,00016  0,02848  0,00028   0,0028  0,00012  0,00092  0,08612  0,00704
B              0,00364  2,27228  0,00244  0,00136  0,00024  0,00504  1,08716
C                       0,00032   4,0033  0,00024  0,00012        0  0,00592
D                                0,01288  0,00268  0,00644  0,00012  5,57488
E                                         0,00048  0,00012   0,0886  0,01948
F                                                  0,00016  0,00188   0,0212
G                                                            0,0014  0,00244
H                                                                     0,0009

pd.pivot_table与自定义aggfunc一起使用。