【问题标题】:Sorting month columns in pandas pivot_table对 pandas pivot_table 中的月份列进行排序
【发布时间】:2018-07-03 21:49:07
【问题描述】:

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

【问题讨论】:

  • 月份列是字符串还是整数?您能否显示原始df 的 5-10 行以便重构您的输出?
  • 在你展示数据之前,我只能为你提供这个链接..stackoverflow.com/questions/47152691/how-to-pivot-a-dataframe/…
  • @cᴏʟᴅsᴘᴇᴇᴅ。这是一个字符串。我已经添加了数据以及完整的代码。
  • 录音是按时间顺序制作的吗?
  • 在 csv 中?不一定

标签: python python-2.7 pandas


【解决方案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

【讨论】:

    猜你喜欢
    • 2017-04-28
    • 2021-06-29
    • 2023-03-30
    • 2023-04-01
    • 2018-06-11
    • 2020-08-31
    • 2018-08-01
    • 1970-01-01
    相关资源
    最近更新 更多