我有一个看起来像这样的 df:
我正在尝试构建一个函数,例如入口是 df 中的任何值,输出是该值所属的列。
我的想法是做类似的事情
df[df == val].stack().index[0][1]
它确实有效,但经过多次迭代后速度有点慢。 如果你们知道任何其他更快的方法来获得相同的结果,那就太好了。
我正在使用的 df 并不比这个大多少。它的形状是 (21, 16),也许如果我像字典或其他东西一样存储它会更好。
请注意任何输入。
最佳答案
使用numpy.where
对于行和列的索引,然后使用 next
和 iter
技巧过滤列名以获得第一个匹配值,如果不匹配的值获取自定义字符串 - 这里 不存在
:
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/