python - 如何更快地获取基于 pandas Dataframe 给定值的列?

标签 python pandas dataframe

我有一个看起来像这样的 df:

<表类="s-表"> <头> A列 B列 C列 D列 <正文> 单元格 1 单元格 6 单元格 8 单元格 4 单元格 2 单元格 7 单元格 9 南 单元格 3 南 单元格 10 南 单元格 4 南 南 南 单元格 5 南 南 南

我正在尝试构建一个函数,例如入口是 df 中的任何值,输出是该值所属的列。

我的想法是做类似的事情

df[df == val].stack().index[0][1]

它确实有效,但经过多次迭代后速度有点慢。 如果你们知道任何其他更快的方法来获得相同的结果,那就太好了。

我正在使用的 df 并不比这个大多少。它的形状是 (21, 16),也许如果我像字典或其他东西一样存储它会更好。

请注意任何输入。

最佳答案

使用numpy.where对于行和列的索引,然后使用 nextiter 技巧过滤列名以获得第一个匹配值,如果不匹配的值获取自定义字符串 - 这里 不存在:

r, c = np.where(df.to_numpy() == val)

first_matched_col = next(iter(df.columns[c]), 'not exist')

在小数据样本中的比较——它比原始解决方案快 53 倍:

In [138]: %%timeit
     ...: df[df == val].stack().index[0][1]
     ...: 
1.23 ms ± 88.2 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)

In [139]: %%timeit 
     ...: r, c = np.where(df == val)
     ...: 
     ...: first_matched_col = next(iter(df.columns[c]), 'not exist')
     ...: 
128 µs ± 23.6 µs per loop (mean ± std. dev. of 7 runs, 10000 loops each)

In [140]: %%timeit 
     ...: r, c = np.where(df.to_numpy() == val)
     ...: 
     ...: first_matched_col = next(iter(df.columns[c]), 'not exist')
     ...: 
     ...: 
23.1 µs ± 1.39 µs per loop (mean ± std. dev. of 7 runs, 10000 loops each)

对于匹配的所有匹配值使用join:

r, c = np.where(df.to_numpy() == val)
all_matched_col = ','.join(df.columns[c])

关于python - 如何更快地获取基于 pandas Dataframe 给定值的列?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/75147800/

相关文章:

python - 如何查找 <div > 的特定属性的值

python - 从外部访问python开发服务器

python - 如何在Python中从文本文件中单独分割数字?

python - 字符串在 Pandas 数据框中包含python中的函数?

r - R 数据帧中的重复数据删除/折叠记录

python - Pandas DataFrame - 插入行的副本并进行一些更改

python - 根据 Pandas 的开始日期按组检查所有条件是否为真

python - 如果值包含字符串,则设置另一个列值

python - Pandas 将 NaN 替换为 None 表现出违反直觉的行为

r - 如何命名 data.frame 的未命名第一列