在pandas pivot_table中对月份列进行排序

时间:2018-01-24 18:36:54

标签: python python-2.7 pandas

我有一个由4列组成的数据集,分子分母,国家和月份。我将它转换为将列数作为列,将国家作为索引,将值作为sum(numerator)/sum(denominator)。我得到的唯一问题是我的列全都乱了。如何对列进行排序,以便在前几个月出现?我试了table = table.sort_index(1)没有运气。

table = pd.pivot_table(df, values=['Numerator', 'Denominator'], index='Country',
                columns=['Month'], aggfunc=np.sum)

table = table['Numerator'] / table['Denominator']

使用完整示例和数据进行编辑

数据:

Denominator,Numerator,Country,Month
10,4,USA,1-Jan
6,2,USA,1-Jan
10,1,Canada,1-Jan
9,2,Canada,1-Jan
6,4,Canada,1-Feb
4,3,Canada,1-Feb

代码:

import pandas as pd
import numpy as np

df = pd.read_csv('data.csv')

table = pd.pivot_table(df, values=['Numerator', 'Denominator'], index='Country',
                columns=['Month'], aggfunc=np.sum)
table = table['Numerator'] / table['Denominator']
print table

输出:

Month    1-Feb     1-Jan
Country                 
Canada     0.7  0.157895
USA        NaN  0.37500

期望的输出:

Month    1-Jan     1-Feb
Country                 
Canada     0.157895  0.7
USA        0.37500   NaN

1 个答案:

答案 0 :(得分:1)

选项1
pivot 之前对pivot强加排序顺序 此选项有效,因为pivot会自动对索引和列值进行排序并显示它们。目前,Month是一个字符串,因此排序将按字典顺序进行。您可以通过日期时间转换来更改此内容。

df.Month = (pd.to_datetime(df.Month, format='%d-%b'))

table = pd.pivot_table(
   df, 
   values=['Numerator', 'Denominator'], 
   index='Country',
   columns=['Month'], 
   aggfunc=np.sum
)
table = table['Numerator'] / table['Denominator']

table.columns = table.columns.strftime('%d-%b')

table

           01-Jan  01-Feb
Country                  
Canada   0.157895     0.7
USA      0.375000     NaN

选项2
pivot 之后重新排序 如果您的数据按时间顺序存储,您只需找到df.Month.unique并使用它来重新索引结果。

table.reindex(columns=df.Month.unique())

Month       1-Jan  1-Feb
Country                 
Canada   0.157895    0.7
USA      0.375000    NaN

如果不是这种情况(并且您的数据不是按时间顺序排序),请使用pd.to_datetime + pd.Series.argsort + unique进行一些解决方法

u = df.Month.iloc[
       pd.to_datetime(df.Month, format='%d-%b').argsort()
].unique()

table.reindex(columns=u)

Month       1-Jan  1-Feb
Country                 
Canada   0.157895    0.7
USA      0.375000    NaN