选项1
您应该可以使用set_index堆栈执行此操作:
df.set_index('Key').stack().reset_index(level=0, name='value').reset_index(drop=True)
Key value
0 a b
1 d e
2 f g
3 f h
4 q r
5 q s
6 q t
如果您不想继续重置索引,那么使用中间变量并创建一个新的DataFrame:
v = df.set_index('Key').stack()
pd.DataFrame({'Key' : v.index.get_level_values(0), 'value' : v.values})
Key value
0 a b
1 d e
2 f g
3 f h
4 q r
5 q s
6 q t
这里的本质是默认情况下堆栈自动摆脱NaN(你可以通过设置dropna = False来禁用它).
选项2
使用np.repeat和numpy的pd.DataFrame.stack版本获得更高的性能:
i = df.pop('Key').values
j = df.values.ravel()
pd.DataFrame({'Key' : v.repeat(df.count(axis=1)), 'value' : j[pd.notnull(j)]
})
Key value
0 a b
1 d e
2 f g
3 f h
4 q r
5 q s
6 q t