我有一个数据框
year month v_0 v_1 ... v_27 v_28 v_29 v_30
0 1919 03 0.0 0.0 ... 0.0 13.0 0.0 0.0
1 1919 04 5.0 0.0 ... 0.0 0.0 0.0 -9999.0
2 1919 05 0.0 0.0 ... 0.0 0.0 0.0 0.0
标题是年,月和每月的每一天。我想将每天的单独标题转换为单列,这将是每个月的日数,然后是数据。它应该看起来像这样。
Year Month Day Value
1919 3 1 0
1919 3 2 0
答案 0 :(得分:2)
您可能需要检查wide_to_long
pd.wide_to_long(df,'v',i=['year','month'],j='day',sep='_').reset_index()
Out[108]:
year month day v
0 1919 3 0 0.0
1 1919 3 1 0.0
2 1919 3 27 0.0
3 1919 3 28 13.0
4 1919 3 29 0.0
5 1919 3 30 0.0
6 1919 4 0 5.0
7 1919 4 1 0.0
8 1919 4 27 0.0
9 1919 4 28 0.0
10 1919 4 29 0.0
11 1919 4 30 -9999.0
12 1919 5 0 0.0
13 1919 5 1 0.0
14 1919 5 27 0.0
15 1919 5 28 0.0
16 1919 5 29 0.0
17 1919 5 30 0.0
答案 1 :(得分:1)
您要使用DataFrame.melt():
考虑以下数据帧df:
Year Month v_1 v_2
0 1901 2 4 8
1 1902 3 5 9
2 1903 4 6 10
3 1904 5 7 11
调用df.melt(id_vars=['Year', 'Month'], var_name='Day')
会产生以下结果:
Year Month Day value
0 1901 2 v_1 4
1 1902 3 v_1 5
2 1903 4 v_1 6
3 1904 5 v_1 7
4 1901 2 v_2 8
5 1902 3 v_2 9
6 1903 4 v_2 10
7 1904 5 v_2 11
这里发生的是,melt将所有数据从“年”和“月”(id_vars)以外的列移到新的“值”列中,并且列名(v_0,v_1等)将变成一个新列,称为“变量”。我们可以使用var_name参数设置此新列的名称,我在上面将其设置为“ Day”。
实际上,由于“日期”列的名称以“ v_”开头,因此我将从重命名这些列开始:
df.rename(axis='columns', mapper=lambda s: s.split('_')[-1], inplace=True)
df.melt(id_vars=['Year', 'Month'], var_name='Day')