转置和重新排列数据框 pandas

Transpose and rearrange Dataframe pandas

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

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
...

等等...

如果不需要,请使用 melt 删除 NaNs:

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

删除 NaNs 添加 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

对于删除 NaNs 的稍微不同的排序,可以使用 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

使用理解和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