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

Posted

技术标签:

【中文标题】为熊猫中的每一列获取非零值【英文标题】:Get non zero values for each column in pandas 【发布时间】:2018-08-28 09:51:49 【问题描述】:

我有熊猫数据框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

【问题讨论】:

所有列都只有一个非零值?如果不是您的预期输出? @AkshayNevrekar 是的,他们只有一个非零值。 【参考方案1】:

DataFrame.loc 与字典理解一起使用,如果始终存在至少一个非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

【讨论】:

【参考方案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 

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

【讨论】:

文档中明确不鼓励使用链式索引。请改用.loc 谢谢@jpp!更新了答案 也不要转换为列表。请改用ilociatvalues[0]。列表转换没有理由提取第一个值! @jezrael 可能不是一个糟糕的点击,他有更多的想法。我想我最终在回答 Q 而不是提问时学到了更多。非常感谢!【参考方案3】:

单行答案是:

df.sum().to_dict()

【讨论】:

以上是关于为熊猫中的每一列获取非零值的主要内容,如果未能解决你的问题,请参考以下文章

编译器是不是应该正确地将 bool 中的任意非零值解释为 true?

在 TensorFlow 中,如何使用 python 从张量中获取非零值及其索引?

为啥 Keras Dropout 中的非零值会发生变化?

用先前的非零值替换向量中的所有零

curl_setopt的选项的值

TSQL - 列中所有非零值的平均值