Pandas列排序顺序

时间:2017-09-10 16:33:13

标签: python-2.7 pandas

我正在使用rolling()。agg和向数据帧添加列。

def add_mean_std_cols(df):
    res = df.rolling(5).agg(['mean','std'])

    res.columns = res.columns.map('_'.join)

    final = res.join(df).sort_index(axis=1)
    return final

np.random.seed(20)
df = pd.DataFrame(np.random.randint(0,9,size=(10, 6)), columns=list('ABCDEF'))
print
print df
print
df.columns = ['A', 'A/B','AB', 'AC', 'C/B', 'D']

print add_mean_std_cols(df)

问题是输出列名称顺序:

   A  A/B  A/B_mean   A/B_std  AB  AB_mean    AB_std  AC  AC_mean    AC_std  A_mean     A_std  C/B  C/B_mean   C/B_std  D  D_mean     D_std
0  3    4       NaN       NaN   6      NaN       NaN   7      NaN       NaN     NaN       NaN    2       NaN       NaN  0     NaN       NaN
1  6    8       NaN       NaN   5      NaN       NaN   3      NaN       NaN     NaN       NaN    0       NaN       NaN  6     NaN       NaN
2  6    0       NaN       NaN   5      NaN       NaN   7      NaN       NaN     NaN       NaN    5       NaN       NaN  2     NaN       NaN
3  6    3       NaN       NaN   3      NaN       NaN   0      NaN       NaN     NaN       NaN    6       NaN       NaN  2     NaN       NaN
4  3    1       3.2  3.114482   8      5.4  1.816590   0      3.4  3.507136     4.8  1.643168    2       3.0  2.449490  7     3.4  2.966479
5  6    6       3.6  3.361547   8      5.8  2.167948   2      2.4  2.880972     5.4  1.341641    1       2.8  2.588436  3     4.0  2.345208
6  2    6       3.2  2.774887   4      5.6  2.302173   6      3.0  3.316625     4.6  1.949359    4       3.6  2.073644  8     4.4  2.880972
7  6    2       3.6  2.302173   3      5.2  2.588436   1      1.8  2.489980     4.6  1.949359    5       3.6  2.073644  2     4.4  2.880972
8  1    8       4.6  2.966479   2      5.0  2.828427   4      2.6  2.408319     3.6  2.302173    4       3.2  1.643168  8     5.6  2.880972
9  6    0       4.4  3.286335   3      4.0  2.345208   4      3.4  1.949359     4.2  2.489980    0       2.8  2.167948  5     5.2  2.774887

出于某种原因,它在A_mean A_std之前对A / B和AB进行排序。

我更喜欢的顺序是:

A  A_mean  A_std ... 

从播放开始,似乎'_'排在最后。

有关如何实现所需订单的任何建议?

谢谢!

2 个答案:

答案 0 :(得分:0)

In [60]: res = df.rolling(5).agg(['mean','std'])

In [61]: res.columns = res.columns.map('_'.join)

In [62]: cols = np.concatenate(list(zip(df.columns, res.columns[0::2], res.columns[1::2])))

In [63]: res.join(df).loc[:, cols]
Out[63]:
   A  A_mean     A_std  A/B  A/B_mean   A/B_std  AB  AB_mean    AB_std  AC  AC_mean    AC_std  C/B  C/B_mean   C/B_std  D  D_mean  \
0  3     NaN       NaN    4       NaN       NaN   6      NaN       NaN   7      NaN       NaN    2       NaN       NaN  0     NaN
1  6     NaN       NaN    8       NaN       NaN   5      NaN       NaN   3      NaN       NaN    0       NaN       NaN  6     NaN
2  6     NaN       NaN    0       NaN       NaN   5      NaN       NaN   7      NaN       NaN    5       NaN       NaN  2     NaN
3  6     NaN       NaN    3       NaN       NaN   3      NaN       NaN   0      NaN       NaN    6       NaN       NaN  2     NaN
4  3     4.8  1.643168    1       3.2  3.114482   8      5.4  1.816590   0      3.4  3.507136    2       3.0  2.449490  7     3.4
5  6     5.4  1.341641    6       3.6  3.361547   8      5.8  2.167948   2      2.4  2.880972    1       2.8  2.588436  3     4.0
6  2     4.6  1.949359    6       3.2  2.774887   4      5.6  2.302173   6      3.0  3.316625    4       3.6  2.073644  8     4.4
7  6     4.6  1.949359    2       3.6  2.302173   3      5.2  2.588436   1      1.8  2.489980    5       3.6  2.073644  2     4.4
8  1     3.6  2.302173    8       4.6  2.966479   2      5.0  2.828427   4      2.6  2.408319    4       3.2  1.643168  8     5.6
9  6     4.2  2.489980    0       4.4  3.286335   3      4.0  2.345208   4      3.4  1.949359    0       2.8  2.167948  5     5.2

      D_std
0       NaN
1       NaN
2       NaN
3       NaN
4  2.966479
5  2.345208
6  2.880972
7  2.880972
8  2.880972
9  2.774887

答案 1 :(得分:0)

您可MultiIndex def add_mean_std_cols(df): res = df.rolling(5).agg(['mean','std']) df.columns = [df.columns, [''] * len(df.columns)] final = res.join(df).sort_index(axis=1) final.columns = final.columns.map('_'.join).str.strip('_') return final print (add_mean_std_cols(df)) A A_mean A_std A/B A/B_mean A/B_std AB AB_mean AB_std AC \ 0 3 NaN NaN 4 NaN NaN 6 NaN NaN 7 1 6 NaN NaN 8 NaN NaN 5 NaN NaN 3 2 6 NaN NaN 0 NaN NaN 5 NaN NaN 7 3 6 NaN NaN 3 NaN NaN 3 NaN NaN 0 4 3 4.8 1.643168 1 3.2 3.114482 8 5.4 1.816590 0 5 6 5.4 1.341641 6 3.6 3.361547 8 5.8 2.167948 2 6 2 4.6 1.949359 6 3.2 2.774887 4 5.6 2.302173 6 7 6 4.6 1.949359 2 3.6 2.302173 3 5.2 2.588436 1 8 1 3.6 2.302173 8 4.6 2.966479 2 5.0 2.828427 4 9 6 4.2 2.489980 0 4.4 3.286335 3 4.0 2.345208 4 AC_mean AC_std C/B C/B_mean C/B_std D D_mean D_std 0 NaN NaN 2 NaN NaN 0 NaN NaN 1 NaN NaN 0 NaN NaN 6 NaN NaN 2 NaN NaN 5 NaN NaN 2 NaN NaN 3 NaN NaN 6 NaN NaN 2 NaN NaN 4 3.4 3.507136 2 3.0 2.449490 7 3.4 2.966479 5 2.4 2.880972 1 2.8 2.588436 3 4.0 2.345208 6 3.0 3.316625 4 3.6 2.073644 8 4.4 2.880972 7 1.8 2.489980 5 3.6 2.073644 2 4.4 2.880972 8 2.6 2.408319 4 3.2 1.643168 8 5.6 2.880972 9 3.4 1.949359 0 2.8 2.167948 5 5.2 2.774887 然后join

if (move_uploaded_file($_FILES['healthfile']['tmp_name'], $newname))