如何将宽格式Pandas DataFrame转长格式?温度数据处理问题
温度数据集格式转换问题解决方法
我正在整理一份温度数据集,要让它和现有数据集格式一致,但遍历DataFrame追加数据时出了问题。
原数据格式
Year Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec 0 1901 -3.16 -4.14 2.05 6.85 13.72 18.27 22.22 20.54 15.30 10.50 2.60 -2.68 1 1902 -3.73 -2.67 1.78 7.62 14.35 18.21 20.51 19.81 14.97 9.93 3.20 -4.02 2 1903 -3.93 -4.39 2.44 7.18 13.07 17.22 20.25 19.67 15.00 9.35 1.52 -2.84 3 1904 -5.49 -3.92 1.83 7.22 13.46 17.78 20.22 19.25 15.87 9.60 3.20 -2.31 4 1905 -4.89 -4.40 4.54 8.01 13.20 18.24 20.25 20.21 16.15 8.42 3.47 -3.28 .. ... ... ... ... ... ... ... ... ... ... ... ... ... 116 2017 -2.07 1.77 3.84 10.02 14.21 19.69 22.57 20.38 17.15 10.85 4.40 -0.77 117 2018 -2.36 -0.56 3.39 7.49 16.39 20.09 22.39 21.01 17.57 10.37 2.48 -0.57 118 2019 -2.38 -1.85 2.93 9.53 14.10 19.21 22.38 21.31 18.41 9.37 3.00 -0.08 119 2020 -1.85 -0.98 4.50 8.34 14.61 19.66 22.42 21.69 16.75 9.99 4.92 -0.38 120 2021 -0.98 -3.86 3.94 8.41 14.06 20.63 22.22 21.23 17.48 11.47 3.54 0.88
尝试的代码
import pandas as pds df = pds.read_excel("Temp_Data.xlsx") data = pds.dataframe() for i in range(len(df)): data1 = df.iloc[i] data.append(data1)
代码运行结果
print(data) Feb -0.72 Mar 0.75 Apr 6.77 May 14.44 Jun 18.40 Jul 20.80 Aug 20.13 Sep 16.17 Oct 10.64 Nov 2.71 Dec -2.80 Name: 43, dtype: float64, Year 1945.00 Jan -2.62 Feb -0.75 Mar 4.00 Apr 7.29 May 12.31 Jun 16.98 Jul 20.76 Aug 20.11 Sep 16.08 Oct 9.82 Nov 2.09 Dec -3.87
注意:数据莫名从1945年开始到2021年,且格式不符合预期
期望的最终格式
Date Temp 0 190101 -3.16 1 190102 -4.14 2 190103 2.05 3 190104 6.85 4 190105 13.72 5 190106 18.27 6 190107 22.22 7 190108 20.54 8 190109 15.30 9 190110 10.50 10 190111 2.60 11 190112 -2.68 12 190201 -3.73 13 190202 -2.67 14 190203 1.78 15 190204 7.62 16 190205 14.35 17 190206 18.21 18 190207 20.51 19 190208 19.81 20 190209 14.97 21 190210 9.93 22 190211 3.20 23 190212 -4.02
解决方案
不要用循环追加,Pandas有专门的宽表转长表函数melt,一步就能搞定,而且效率更高:
import pandas as pds # 读取数据 df = pds.read_excel("Temp_Data.xlsx") # 宽表转长表,保留Year列,将月份列转为行 melted_df = df.melt(id_vars=["Year"], var_name="Month", value_name="Temp") # 月份转数字:Jan→01,Feb→02... month_map = { "Jan": "01", "Feb": "02", "Mar": "03", "Apr": "04", "May": "05", "Jun": "06", "Jul": "07", "Aug": "08", "Sep": "09", "Oct": "10", "Nov": "11", "Dec": "12" } melted_df["Month"] = melted_df["Month"].map(month_map) # 拼接Year和Month得到Date列 melted_df["Date"] = melted_df["Year"].astype(str) + melted_df["Month"] # 调整列顺序并重置索引 final_df = melted_df[["Date", "Temp"]].reset_index(drop=True) print(final_df.head(24))
原代码问题分析
pds.dataframe()拼写错误,应为pds.DataFrame()(首字母大写),空DataFrame创建时的错误可能导致后续数据异常- Pandas的
append方法已被弃用,循环追加不仅效率极低,还容易引发索引混乱、数据丢失问题 - 循环逻辑仅整行追加,未实现宽表转长表的核心需求,完全没拆分月份为单独行
运行上述解决方案代码,即可得到符合预期的格式,且包含所有年份的数据,不会出现数据起始异常的问题。
内容的提问来源于stack exchange,提问作者jimbybob1
相关产品推荐
相关产品推荐

