我有一个像这样的数据框
id a b c
101 0 3 0
102 2 0 5
103 0 1 4
我想要这样的东西
id letter num
101 a 0
101 b 3
101 c 0
102 a 2
102 b 0
102 c 5
103 a 0
103 b 1
103 c 4
我想将列名称传递给行的值及其对应的id和df的结果。
我试图在一个循环中创建它,根据它的id引入每个元素,但它太可怕了。有一个简单的方法吗?
答案 0 :(得分:6)
您可以melt
然后排序:
>>> pd.melt(df, id_vars='id', value_vars=['a','b','c'],
var_name='letter', value_name='num').sort_values('id')
id letter num
0 101 a 0
3 101 b 3
6 101 c 0
1 102 a 2
4 102 b 0
7 102 c 5
2 103 a 0
5 103 b 1
8 103 c 4
如果要重置索引,可以始终在返回的DataFrame上使用.reset_index(drop=True)
。
答案 1 :(得分:0)
你可能想要按照
的方式做点什么df2 = df.stack().reset_index(1)
然后重命名列
df2.columns = ['letter', 'num']
df.stack()
生成一个包含多级索引的系列:
In [5]: df.stack()
Out[5]:
id
101 a 0
b 3
c 0
102 a 2
b 0
c 5
103 a 0
b 1
c 4
dtype: int64
然后,您希望将此多级索引拆分为自己的列。使用reset_index(1)
会将id
列作为索引。但请注意其他列的名称错误(对应于多级索引中的前一级别)。
In [6]: df.stack().reset_index(1)
Out[6]:
level_1 0
id
101 a 0
101 b 3
101 c 0
102 a 2
102 b 0
102 c 5
103 a 0
103 b 1
103 c 4
重命名:
In [8]: df2.columns = ['letter', 'num']
In [9]: df2
Out[9]:
letter num
id
101 a 0
101 b 3
101 c 0
102 a 2
102 b 0
102 c 5
103 a 0
103 b 1
103 c 4
答案 2 :(得分:0)
您可以使用ravel
将值重新整形为一列。
df = pd.DataFrame({'id': [101, 102, 103],
'a': [0, 2, 0],
'b': [3, 0, 1],
'c': [0, 5, 4]})[['id', 'a', 'b', 'c']]
>>> pd.DataFrame({'letter': df.columns[1:].tolist() * len(df),
'num': df.iloc[:, 1:].values.ravel()})
letter num
0 a 0
1 b 3
2 c 0
3 a 2
4 b 0
5 c 5
6 a 0
7 b 1
8 c 4