gpt4 book ai didi

python - 选择值大于 Pandas 中另一列的所有列名

转载 作者:太空宇宙 更新时间:2023-11-03 12:30:58 25 4
gpt4 key购买 nike

我正在尝试查找 pandas 数据框中每一列的列名,其中的值大于另一列的值。

例如,如果我有以下数据框:

   A  B  C  D  threshold
0 1 3 3 1 2
1 2 3 6 1 5
2 9 5 0 2 4

对于每一行,我想返回值大于阈值的列的名称,因此我会:

0: B, C
1: C
2: A, B

如有任何帮助,我们将不胜感激!

最佳答案

如果您想大幅提高速度,可以使用 NumPy 的矢量化 where 函数。

s = np.where(df.gt(df['threshold'],0), ['A, ', 'B, ', 'C, ', 'D, ', ''], '')
pd.Series([''.join(x).strip(', ') for x in s])

0 B, C
1 C
2 A, B
dtype: object

当使用 100,000 行的数据帧时,与 @jezrael 和 MaxU 解决方案相比,速度提高了一个数量级以上。这里我先创建测试 DataFrame。

n = 100000
df = pd.DataFrame(np.random.randint(0, 10, (n, 5)),
columns=['A', 'B', 'C', 'D', 'threshold'])

时间

%%timeit
>>> s = np.where(df.gt(df['threshold'],0), ['A, ', 'B, ', 'C, ', 'D, ', ''], '')
>>> pd.Series([''.join(x).strip(', ') for x in s])
280 ms ± 5.29 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)

%%timeit
>>> df1 = df.drop('threshold', 1).gt(df['threshold'], 0)
>>> df1 = df1.apply(lambda x: ', '.join(x.index[x]),axis=1)
3.15 s ± 82.1 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)

%%timeit
>>> x = df.drop('threshold',1)
>>> x.T.gt(df['threshold']).agg(lambda c: ', '.join(x.columns[c]))
3.28 s ± 145 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)

关于python - 选择值大于 Pandas 中另一列的所有列名,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45935143/

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