我有一个包含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
我不知道如何继续这个?
答案 0 :(得分:3)
使用pandas.melt
,并将维护的列(此处DateTime
)设置为id_vars
,默认情况下所有列都将以长格式收集,并且标题位于一个列,另一个值;您可以使用var_name
和value_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')