gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-29 22:15:34 25 4
gpt4 key购买 nike

有没有一种好方法可以找到 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com