我有一个像这样的pandas数据框:
data = {'1' : [0, 2, 0, 0], '2' : [5, 0, 0, 2], '3' : [2, 0, 0, 0], '4' : [0, 7, 0, 0]}
df = pd.DataFrame(data, index = ['a', 'b', 'c', 'd'])
df
1 2 3 4
a 0 5 2 0
b 2 0 0 7
c 0 0 0 0
d 0 2 0 0
我知道我可以通过分别获取每行的最大值和相应的列名:
df.max(1)
df.idxmax(1)
如何获取非零的每个单元格的值和列名? 所以在这种情况下,我想要2个表,一个给我每个值!每行= 0:
a 5
a 2
b 2
b 7
d 2
一个给我这些值的列名:
a 2
a 3
b 1
b 4
d 2
谢谢!
答案 0 :(得分:0)
您可以将stack
用于Series
,然后按boolean indexing
,rename_axis
,reset_index
和最后drop
列进行过滤,或按以下选择列子集:
s = df.stack()
df1 = s[s!= 0].rename_axis(['a','b']).reset_index(name='c')
print (df1)
a b c
0 a 2 5
1 a 3 2
2 b 1 2
3 b 4 7
4 d 2 2
df2 = df1.drop('b', axis=1)
print (df2)
a c
0 a 5
1 a 2
2 b 2
3 b 7
4 d 2
df3 = df1.drop('c', axis=1)
print (df3)
a b
0 a 2
1 a 3
2 b 1
3 b 4
4 d 2
df3 = df1[['a','c']]
print (df3)
a c
0 a 5
1 a 2
2 b 2
3 b 7
4 d 2
df3 = df1[['a','b']]
print (df3)
a b
0 a 2
1 a 3
2 b 1
3 b 4
4 d 2