Python 将多行数据转换为单列

Python 将多行数据转换为单列,python,pandas,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

我有一个数据帧

     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

您想使用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_变量)之外的所有列中的数据移动到一个新列“value”,列名称(v_0、v_1等)将成为一个称为“variable”的新列。我们可以使用var_name参数设置这个新列的名称,我已经在上面设置为“Day”

事实上,由于day列的名称以“v_”开头,我将首先重命名这些列:

df.rename(axis='columns', mapper=lambda s: s.split('_')[-1], inplace=True)
df.melt(id_vars=['Year', 'Month'], var_name='Day')

您可能需要检查
wide\u to\u 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

请仅以文本形式发布框架。抱歉,现在刚刚发布。在他的数据基础上叠加OverflowBase是相当新的,你的一天变成了v_1,v_2…,之后你需要拆分melt@Wen我不明白你的意思。我的“Day”是一个基于所有其他列(问题中的v_1,v_2)的新列。名称“Day”取自var_name参数。您使用的数据框有不同的列名称。这非常有效。谢谢是的,使用上面的方法,我必须拆分才能得到一天number@Chinmay:我添加了一个不同的解决方案,该解决方案从重命名列开始;这比事后检查所有行要快。这同样有效。尽管我需要考虑如何分道扬镳number@Chinmay通过使用从宽到长,您不需要拆分它,它已经在函数中为您拆分了是的,不需要使用从宽到长进行拆分。谢谢