获取熊猫中每一列的非零值

时间:2018-08-28 09:51:49

标签: python python-3.x pandas

我的熊猫数据框为df

accel access adviser afpif  afp   publish  afraid verizon
0.00  0.14    0.00   0.00   0.00   0.13    0.00   0.44
0.13  0.00    0.00   0.77   0.00   0.00    0.22   0.00
0.00  0.00    0.87   0.00   0.34   0.00    0.00   0.00
......................................................
.....................................................

我还有一个列表L,其中包含列名称作为元素

L=['accel','afp','publish']

我要基于pandas dataframe提取这些列表元素的非零值。

预期输出:-

dictionary={'accel':0.13,'afp':0.34,'publish':0.13}

3 个答案:

答案 0 :(得分:4)

使用DataFrame.loc和dict理解,如果总是存在至少一个非0值,则使用iat

d = {c: df.loc[df[c] ! =0, c].iat[0] for c in L }
print (d)
{'accel': 0.13, 'afp': 0.34, 'publish': 0.13}

更一般的方法也只使用0列:

d = {c: next(iter(df.loc[df[c] != 0, c]), 'no value') for c in L }
print (d)
{'accel': 0.13, 'afp': 0.34, 'publish': 0.13}

答案 1 :(得分:2)

感谢@jpp,不使用链接索引,而是使用.loc-

op = { col: df.loc[df[col].ne(0), col].tolist() for col in L }

输出-

{'accel': [0.13], 'afp': [0.34], 'publish': [0.13]}

从某种意义上说,此实现会更健壮,因为它可以检索多个非零值。但是,如果确定只需要一个值,则可以将其过滤到dict理解本身内-

op = { col: df.loc[df[col].ne(0), col].iat[0] for col in L }

OR

op = { col: df.loc[df[col].ne(0), col].values[0] for col in L }

输出-

{'accel': 0.13, 'afp': 0.34, 'publish': 0.13}

注意:如果您确定非零值是正数,则可以使用>0Series.gt() API

答案 2 :(得分:-1)

一个答案是:

df.sum().to_dict()