获取值和列名称

时间:2017-06-22 11:14:33

标签: python pandas dataframe

我有一个像这样的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

谢谢!

1 个答案:

答案 0 :(得分:0)

您可以将stack用于Series,然后按boolean indexingrename_axisreset_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