python - 在 Pandas 数据框中的每一行中找到非零值的列索引集

标签 python pandas

有没有一种好方法可以找到 pandas 数据框中每一行中非零值的列索引集?我必须逐行遍历数据框吗?

例如数据框是

c1  c2  c3  c4 c5 c6 c7 c8  c9
 1   1   0   0  0  0  0  0   0
 1   0   0   0  0  0  0  0   0
 0   1   0   0  0  0  0  0   0
 1   0   0   0  0  0  0  0   0
 0   1   0   0  0  0  0  0   0
 0   0   0   0  0  0  0  0   0
 0   2   1   1  1  1  1  0   2
 1   5   5   0  0  1  0  4   6
 4   3   0   1  1  1  1  5  10
 3   5   2   4  1  2  2  1   3
 6   4   0   1  0  0  0  0   0
 3   9   1   0  1  0  2  1   0

预期的输出是

['c1','c2']
['c1']
['c2']
...

最佳答案

看来你必须逐行遍历DataFrame。

cols = df.columns
bt = df.apply(lambda x: x > 0)
bt.apply(lambda x: list(cols[x.values]), axis=1)

你会得到:

0                                 [c1, c2]
1                                     [c1]
2                                     [c2]
3                                     [c1]
4                                     [c2]
5                                       []
6             [c2, c3, c4, c5, c6, c7, c9]
7                 [c1, c2, c3, c6, c8, c9]
8         [c1, c2, c4, c5, c6, c7, c8, c9]
9     [c1, c2, c3, c4, c5, c6, c7, c8, c9]
10                            [c1, c2, c4]
11                [c1, c2, c3, c5, c7, c8]
dtype: object

如果性能很重要,请尝试将 raw=True 传递给 bool DataFrame 创建,如下所示:

%timeit df.apply(lambda x: x > 0, raw=True).apply(lambda x: list(cols[x.values]), axis=1)
1000 loops, best of 3: 812 µs per loop

它为您带来更好的性能提升。以下是 raw=False(默认)结果:

%timeit df.apply(lambda x: x > 0).apply(lambda x: list(cols[x.values]), axis=1)
100 loops, best of 3: 2.59 ms per loop

关于python - 在 Pandas 数据框中的每一行中找到非零值的列索引集,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32768555/

相关文章:

python - 将 pandas 列的元素与另一个 pandas 数据框的列匹配

python - 你能在 Django 中执行多线程任务吗?

python - python 的 ss.kstest 与 R 的 ks.test 的结果冲突(测试样本是否均匀分布)

python - 根据 pandas 数据框中的相邻列将 NaN 值替换为特定文本

python - 将嵌套字典转换为表/父子结构,Python 3.6

python - 从列表中分配重复值的列

python - 检查是否在 tkinter 中按下了修改键

python - 脚本: updating scripts

python - 在 python 中访问 telnet session

python - 替代 Pandas DataFrame 中的嵌套 np.where