转置并重新排列Dataframe pandas

时间:2017-11-22 09:31:06

标签: pandas dataframe transpose

我需要一些帮助来重新排列数据帧。这就是数据的样子。

Year  item 1  item 2  item 3
2001  22      54      33
2002  77      54      33
2003  22      NaN     33
2004  22      54      NaN

我想要的布局是:

Items   Year  Value
item 1  2001  22
item 1  2002  77
...

等等......

2 个答案:

答案 0 :(得分:2)

如果没有必要,请使用melt删除NaN s:

df = df.melt('Year', var_name='Items', value_name='Value')
print (df)
    Year   Items  Value
0   2001  item 1   22.0
1   2002  item 1   77.0
2   2003  item 1   22.0
3   2004  item 1   22.0
4   2001  item 2   54.0
5   2002  item 2   54.0
6   2003  item 2    NaN
7   2004  item 2   54.0
8   2001  item 3   33.0
9   2002  item 3   33.0
10  2003  item 3   33.0
11  2004  item 3    NaN

要删除NaN,请添加dropna

df = df.melt('Year', var_name='Items', value_name='Value').dropna(subset=['Value'])
print (df)
    Year   Items  Value
0   2001  item 1   22.0
1   2002  item 1   77.0
2   2003  item 1   22.0
3   2004  item 1   22.0
4   2001  item 2   54.0
5   2002  item 2   54.0
7   2004  item 2   54.0
8   2001  item 3   33.0
9   2002  item 3   33.0
10  2003  item 3   33.0

对于删除NaN s的不同排序,可以使用set_index + stack + rename_axis + reset_index

df = df.set_index('Year').stack().rename_axis(['Year','Items']).reset_index(name='Value')
print (df)
   Year   Items  Value
0  2001  item 1   22.0
1  2001  item 2   54.0
2  2001  item 3   33.0
3  2002  item 1   77.0
4  2002  item 2   54.0
5  2002  item 3   33.0
6  2003  item 1   22.0
7  2003  item 3   33.0
8  2004  item 1   22.0
9  2004  item 2   54.0

答案 1 :(得分:0)

使用理解和pd.DataFrame.itertuples

pd.DataFrame(
    [[y, i, v]
     for y, *vals in df.itertuples(index=False)
     for i, v in zip(df.columns[1:], vals)
     if pd.notnull(v)],
    columns=['Year', 'Item', 'Value']
)

   Year    Item  Value
0  2001  item 1   22.0
1  2001  item 2   54.0
2  2001  item 3   33.0
3  2002  item 1   77.0
4  2002  item 2   54.0
5  2002  item 3   33.0
6  2003  item 1   22.0
7  2003  item 3   33.0
8  2004  item 1   22.0
9  2004  item 2   54.0