在pandas中获取每列的非零值

4

我有一个名为 df 的pandas数据框:

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数据框提取这些列表元素的非零值。

预期输出:

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

1
你的所有列只有一个非零值吗?如果不是,你的期望输出会是什么? - Sociopath
@AkshayNevrekar 是的,它们只有一个非零。 - Learner
3个回答

4

使用字典推导和 iat,结合 DataFrame.loc 方法,如果至少有一个非零值,则可以进行操作:

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
感谢@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
1
感谢@jpp!已更新答案。 - Vivek Kalyanarangan
还有,不要将其转换为列表。请改用ilociatvalues[0]。没有理由进行列表转换以提取第一个值! - jpp
@jezrael 他可能只是有更多的事情要考虑,不是故意的。我觉得回答问题时我学到的比提问时还要多。非常感谢! - Vivek Kalyanarangan

-3

简短回答如下:

df.sum().to_dict()

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接