如何解决基于唯一的“其他”列,按月对数据框进行排序并重复年份
在 Pandas 中,我试图按月对大型数据框的行进行排序。目前,月份不正常。它们按字母顺序排序,但我想按时间顺序排序。 棘手的部分是我对每一种产品按 21 个月的周期进行分类。有两个年份栏,一个是日历年,一个是财政年度,它们故意不同。 2021财年为2021年1月-2021年9月,2022财年为2021年10月-2022年9月。有数百种产品,以下部分只是两种产品的示例。
如下表所示,月份是乱序的,但其他一切都在正确的顺序中。
同样,任何产品都有 21 个月,从 2021 年 1 月到 2022 年 9 月。我希望这些对每个产品进行迭代。
我正在寻找一种代码来以正确的方式对这个数据框进行排序。
现在的样子(不是按年份按时间顺序排列的月份):
项目 | 日历年 | 财政年度 | 月 | 金额 |
---|---|---|---|---|
产品 1 | 2021 | 2021 | 四月 | 45 |
产品 1 | 2021 | 2021 | 八月 | 85 |
产品 1 | 2021 | 2021 | 二月 | 25 |
产品 1 | 2021 | 2021 | 一月 | 15 |
产品 1 | 2021 | 2021 | 七月 | 75 |
产品 1 | 2021 | 2021 | 六月 | 65 |
产品 1 | 2021 | 2021 | 三月 | 35 |
产品 1 | 2021 | 2021 | 五月 | 55 |
产品 1 | 2021 | 2021 | 九月 | 95 |
产品 1 | 2021 | 2022 | 十二月 | 125 |
产品 1 | 2021 | 2022 | 11 月 | 115 |
产品 1 | 2021 | 2022 | 十月 | 105 |
产品 1 | 2022 | 2022 | 四月 | 405 |
产品 1 | 2022 | 2022 | 八月 | 805 |
产品 1 | 2022 | 2022 | 二月 | 205 |
产品 1 | 2022 | 2022 | 一月 | 1005 |
产品 1 | 2022 | 2022 | 七月 | 705 |
产品 1 | 2022 | 2022 | 六月 | 605 |
产品 1 | 2022 | 2022 | 三月 | 305 |
产品 1 | 2022 | 2022 | 五月 | 505 |
产品 1 | 2022 | 2022 | 九月 | 905 |
产品 2 | 2021 | 2021 | 四月 | 4000 |
产品 2 | 2021 | 2021 | 八月 | 8000 |
产品 2 | 2021 | 2021 | 二月 | 2000 |
产品 2 | 2021 | 2021 | 一月 | 1000 |
产品 2 | 2021 | 2021 | 七月 | 7000 |
产品 2 | 2021 | 2021 | 六月 | 6000 |
产品 2 | 2021 | 2021 | 三月 | 3000 |
产品 2 | 2021 | 2021 | 五月 | 5000 |
产品 2 | 2021 | 2021 | 九月 | 9000 |
产品 2 | 2021 | 2022 | 十二月 | 12000 |
产品 2 | 2021 | 2022 | 11 月 | 11000 |
产品 2 | 2021 | 2022 | 十月 | 10000 |
产品 2 | 2022 | 2022 | 四月 | 40000 |
产品 2 | 2022 | 2022 | 八月 | 80000 |
产品 2 | 2022 | 2022 | 二月 | 20000 |
产品 2 | 2022 | 2022 | 一月 | 10000 |
产品 2 | 2022 | 2022 | 七月 | 70000 |
产品 2 | 2022 | 2022 | 六月 | 60000 |
产品 2 | 2022 | 2022 | 三月 | 30000 |
产品 2 | 2022 | 2022 | 五月 | 50000 |
产品 2 | 2022 | 2022 | 九月 | 90000 |
它的外观(按月排列):
项目 | 日历年 | 财政年度 | 月 | 金额 |
---|---|---|---|---|
产品 1 | 2021 | 2021 | 一月 | 15 |
产品 1 | 2021 | 2021 | 二月 | 25 |
产品 1 | 2021 | 2021 | 三月 | 35 |
产品 1 | 2021 | 2021 | 四月 | 45 |
产品 1 | 2021 | 2021 | 五月 | 55 |
产品 1 | 2021 | 2021 | 六月 | 65 |
产品 1 | 2021 | 2021 | 七月 | 75 |
产品 1 | 2021 | 2021 | 八月 | 85 |
产品 1 | 2021 | 2021 | 九月 | 95 |
产品 1 | 2021 | 2022 | 十月 | 105 |
产品 1 | 2021 | 2022 | 11 月 | 115 |
产品 1 | 2021 | 2022 | 十二月 | 125 |
产品 1 | 2022 | 2022 | 一月 | 1005 |
产品 1 | 2022 | 2022 | 二月 | 205 |
产品 1 | 2022 | 2022 | 三月 | 305 |
产品 1 | 2022 | 2022 | 四月 | 405 |
产品 1 | 2022 | 2022 | 五月 | 505 |
产品 1 | 2022 | 2022 | 六月 | 605 |
产品 1 | 2022 | 2022 | 七月 | 705 |
产品 1 | 2022 | 2022 | 八月 | 805 |
产品 1 | 2022 | 2022 | 九月 | 905 |
产品 2 | 2021 | 2021 | 一月 | 1000 |
产品 2 | 2021 | 2021 | 二月 | 2000 |
产品 2 | 2021 | 2021 | 三月 | 3000 |
产品 2 | 2021 | 2021 | 四月 | 4000 |
产品 2 | 2021 | 2021 | 五月 | 5000 |
产品 2 | 2021 | 2021 | 六月 | 6000 |
产品 2 | 2021 | 2021 | 七月 | 7000 |
产品 2 | 2021 | 2021 | 八月 | 8000 |
产品 2 | 2021 | 2021 | 九月 | 9000 |
产品 2 | 2021 | 2022 | 十月 | 10000 |
产品 2 | 2021 | 2022 | 11 月 | 11000 |
产品 2 | 2021 | 2022 | 十二月 | 12000 |
产品 2 | 2022 | 2022 | 一月 | 10000 |
产品 2 | 2022 | 2022 | 二月 | 20000 |
产品 2 | 2022 | 2022 | 三月 | 30000 |
产品 2 | 2022 | 2022 | 四月 | 40000 |
产品 2 | 2022 | 2022 | 五月 | 50000 |
产品 2 | 2022 | 2022 | 六月 | 60000 |
产品 2 | 2022 | 2022 | 七月 | 70000 |
产品 2 | 2022 | 2022 | 八月 | 80000 |
产品 2 | 2022 | 2022 | 九月 | 90000 |
解决方法
首先将值转换为 ordered categoricals,因此可以按 DataFrame.sort_values
中的多列进行排序:
cat = ['January','February','March','April','May','June','July','August','September','October','November','December']
df['Month'] = pd.Categorical(df['Month'],ordered=True,categories=cat)
df = df.sort_values(['Item','Calendar Year','Month'])
或创建 DatetimeIndex
,因此可能按 Item
和日期时间排序:
df.index = pd.to_datetime(df['Calendar Year'] + df['Month'],format='%Y%B')
df = df.rename_axis('dt').sort_values(['Item','dt']).reset_index(drop=True)
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。