我有一个由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
答案 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