将pandas数据框更改为平面格式

时间:2017-09-27 21:38:39

标签: python pandas dataframe

我有一个包含100列的pandas数据帧,格式如下:

DateTime    2008_11  2008_12
10/22/2008  2        NaN
10/23/2008  1        NaN
10/24/2008  3        4
10/27/2008  4        6
10/28/2008  NaN      5

我想创建以下平面文件:

DateTime    Name      Value
10/22/2008  2008_11   2
10/23/2008  2008_11   1
10/24/2008  2008_11   3
10/27/2008  2008_11   4
10/28/2008  2008_11   NaN
10/22/2008  2008_12   NaN
10/23/2008  2008_12   NaN
10/24/2008  2008_12   4
10/27/2008  2008_12   6
10/28/2008  2008_12   5

我不知道如何继续这个?

2 个答案:

答案 0 :(得分:3)

使用pandas.melt,并将维护的列(此处DateTime)设置为id_vars,默认情况下所有列都将以长格式收集,并且标题位于一个列,另一个值;您可以使用var_namevalue_name分别重命名这两列:

pd.melt(df, id_vars='DateTime', var_name='name')

      DateTime    name  value
0   10/22/2008  2008_11 2.0
1   10/23/2008  2008_11 1.0
2   10/24/2008  2008_11 3.0
3   10/27/2008  2008_11 4.0
4   10/28/2008  2008_11 NaN
5   10/22/2008  2008_12 NaN
6   10/23/2008  2008_12 NaN
7   10/24/2008  2008_12 4.0
8   10/27/2008  2008_12 6.0
9   10/28/2008  2008_12 5.0

答案 1 :(得分:2)

使用stack

df.set_index('DateTime').stack(dropna=False).reset_index().rename(columns={'level_1':'Name',0:'Value'})
Out[162]: 
     DateTime     Name  Value
0  10/22/2008  2008_11    2.0
1  10/22/2008  2008_12    NaN
2  10/23/2008  2008_11    1.0
3  10/23/2008  2008_12    NaN
4  10/24/2008  2008_11    3.0
5  10/24/2008  2008_12    4.0
6  10/27/2008  2008_11    4.0
7  10/27/2008  2008_12    6.0
8  10/28/2008  2008_11    NaN
9  10/28/2008  2008_12    5.0

作为piRSquared的建议

df.set_index('DateTime').rename_axis('Name', 1).stack(dropna=False).reset_index(name='Value')