在 pandas DataFrame 中搜索列

3

我需要获取 Pandas DataFrame 的列名,其中的列与 NumPy 数组中的列匹配。

示例

import numpy as np
import pandas as pd

x = pd.DataFrame( data=[[0, 0, 1], [0, 1, 0], [1, 0, 0], [0, 1, 1], [0, 1, 0], [0, 1, 1]], columns=list('abc') )

y = np.array( x[['b','c']] )
y

y从DataFrame获取第二列和第三列:

array([[0, 1],
       [1, 0],
       [0, 0],
       [1, 1],
       [1, 0],
       [1, 1]])

如何获取在 x 中存在 y 的列名?(在本例中为 bc

我需要类似于以下内容:

x[ x==y ].columns

或者

pd.DataFrame(y).isin(x)

这个示例是为了解决特征选择问题而设计的,并且参考了sklearn页面上的内容。


我使用的是numpy 1.11.1和pandas 0.18.1。


输入是否总是只包含0和1? - Divakar
@Divakar 不是,但它们始终是数字。我的现在实际上是“浮点数”。 - Luis
数组中的小数位是否重要? - Divakar
2个回答

5

这里有一种使用NumPy广播的方法-

x.columns[(x.values[...,None] == y[:,None]).all(0).any(1)]

太酷了!你能解释一下 x.values[...,None] 是什么吗? - MaxU - stand with Ukraine
1
@MaxU 好的,我们在提取的数组末尾引入了一个单例维度。本质上它是 x.values[:,:,None]。通过使用那个省略号,我们只是替换了 :,:。来自这篇帖子“在这里使用省略号表示未指定的其余数组维度的占位符。” - Divakar
我喜欢这个答案。我也开始这样做了!但那只是因为你教给我的东西;-) - piRSquared
1
@Divakar,当我第一次接触广播时,它对我来说很有意义。但是要跟踪正在发生的事情以及何时发生仍然很棘手。反复查看您的示例已经教会了我很多,并使我能够穿越学习曲线,否则这将更加陡峭。 - piRSquared
1
@Divakar,piRSquared,这对我来说仍然很棘手,但它非常快速和有用。谢谢你,Divakar! - MaxU - stand with Ukraine
显示剩余3条评论

1
也许是这个吗?
import numpy as np
import pandas as pd

x = pd.DataFrame( data=[[0, 0, 1], [0, 1, 0], [1, 0, 0], [0, 1, 1], [0, 1, 0], [0, 1, 1]], columns=list('abc') )

y = np.array( x[['b','c']] )

for yj in y.T:
    for xj in x:
        if (all(x[xj] == yj)):
            print(xj)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接