将多行数据转换为单列

时间:2018-10-15 17:32:33

标签: python pandas

我有一个数据框

     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

2 个答案:

答案 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')