使用pandas的melt函数得到交替结果

3

我尝试使用pandas将这个相册中的第一张图片转换成第二张,但我得到的只有第三张...

  1. 原始图片
Year    Jan     Feb     Mar     Apr     May     Jun     Jul     Aug     Sep     Oct     Nov     Dec
1981    453.1   126.3   5.8     47.1    25.3    16.8    0       1.1     4.4     17.8    52.5    72.4
1982    211.4   23.1    231.2   0.8     0.2     0       0       0       15.3    0.9     8.6     59.9
1983    45.2    22.1    537.7   22.8    29.9    0       0       0.1     0.7     1.2     47      20.9
1984    390.2   514.2   140.3   7.3     0       0       2.8     0.1     0       18.3    23.2    91.7

期望结果:
Year    Month   Value
1981    Jan     453.1
1981    Feb     126.3
1981    Mar     5.8 
1981    Apr     47.1
...

我目前拥有的:
Year    Month   Value
1981    Jan     453.1
1982    Jan     211.4
1983    Jan     45.2
1984    Jan     390.2
...

我的代码只有这些:

data = pd.read_csv("Burketown.csv")
months = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec']
fixed_data = pd.melt(data, id_vars=['Year'], value_vars=months)
print(fixed_data)

我该如何交替每一年的月份,而不是得到当前的结果?我希望第一年包含所有月份,第二年包含所有月份...而不是第一个月包含所有年份。

3
请勿在提问时发布代码或数据的图片(或链接),以保护您的隐私和安全。如果您需要分享代码,可以将其作为纯文本粘贴到问题或回答中。 - jezrael
抱歉,已修复。 - Dewamuval
嗯,我无法复制您的数据,您能否创建原始文本版本? - jezrael
这只是一个有40行的文件,所以相当大。我马上会复制一个例子。 - Dewamuval
请将以下与编程相关的内容从英语翻译为中文。仅返回翻译后的文本:请仅复制前5行。欢迎来到Python编程教程! 我们将从基础开始,逐步深入介绍Python编程语言。 Python是一种高级、解释性编程语言,广泛应用于Web开发、数据分析、人工智能等领域。 学习Python很有趣,并且也是许多公司招聘的必备技能之一。 在这个教程中,我们将探索Python的各个方面,包括变量、条件语句、循环、函数、面向对象编程和文件处理等等。 - jezrael
2个回答

0

使用有序分类的列名,这样可以通过两个列对DataFrame.sort_values进行正确排序:

months = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec']
data = pd.read_csv("Burketown.csv", index_col=['Year'])[months]

data.columns = pd.CategoricalIndex(data.columns, ordered=True, categories=months)
df = data.reset_index()[months]
fixed_data = (pd.melt(data, id_vars=['Year'], value_vars=months)
                .sort_values(['Year', 'variable']))

或将Series转换为有序分类

data = pd.read_csv("Burketown.csv")
months = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec']
fixed_data = pd.melt(data, id_vars=['Year'], value_vars=months)
fixed_data['variable'] = (pd.CategoricalIndex(fixed_data['variable'],
                                              ordered=True, 
                                              categories=months))

fixed_data = fixed_data.sort_values(['Year', 'variable'])

2
类型错误:无法将项目插入到不是现有类别的分类索引中。 - Dewamuval
@Dewamuval - 好的,请添加您的数据,目前解决方案未经测试。 - jezrael
那个有效。非常感谢。我现在会发布数据。 - Dewamuval

0

有一种选项,您无需转换为分类数据类型,且可以保持顺序,即使用pyjanitorpivot_longer函数。

# pip install pyjanitor
import pandas as pd
import janitor

result = df.pivot_longer('Year', sort_by_appearance=True)

result.head(10)

   Year variable  value
0  1981      Jan  453.1
1  1981      Feb  126.3
2  1981      Mar    5.8
3  1981      Apr   47.1
4  1981      May   25.3
5  1981      Jun   16.8
6  1981      Jul    0.0
7  1981      Aug    1.1
8  1981      Sep    4.4
9  1981      Oct   17.8

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接