熊猫检查一个多索引列中的值是否在任何列中,不同多索引的同一行

mko*_*eck 18 python dataframe pandas

我有以下数据框:

df = pd.DataFrame([[0, 1, 7, 0, 1, 8, 3, 0],
                   [7, 3, 4, 0, 4, 9, 7, 0]], 
                  columns=pd.MultiIndex.from_product([["first", "second"], 
                                                      ["A", "B", "C", "D"]]))
print(df)

  first          second         
      A  B  C  D      A  B  C  D
0     0  1  7  0      1  8  3  0
1     7  3  4  0      4  9  7  0
Run Code Online (Sandbox Code Playgroud)

我想检查 first 中的值是否存在于 second 的任何列中。只应比较同一行。

生成的数据框应如下所示:

      A      B      C     D
0  True   True  False  True
1  True  False   True  True
Run Code Online (Sandbox Code Playgroud)

这样做的最佳方法是什么?我已经玩过 df["first"].isin(df["second"] 但它只将 A 与 A、B 与 B 进行比较,......也尝试将它与 .any() 结合使用,但我不能似乎使它起作用。

非常感谢您的帮助!

先感谢您。

Shu*_*rma 10

麻木广播

np.any(df['first'].T.values[:, :, None] == df['second'].values, axis=-1).T
Run Code Online (Sandbox Code Playgroud)
array([[ True,  True, False,  True],
       [ True, False,  True,  True]])
Run Code Online (Sandbox Code Playgroud)

  • 感谢您和所有其他回答的人!我接受了这个答案,因为它似乎在我的数据集上表现最好。这个答案花了 0.0022 秒,@Quang Hoang 花了 0.0125 秒,ashkangh 花了 1.9600 秒。 (2认同)
  • 这是一个很棒的解决方案,结构非常好,ROCK Shubham 欢呼:) (2认同)

小智 5

另一种解决方案:

df['first'].apply(lambda x: x.isin(df.loc[x.name, ('second')]), axis=1)
Run Code Online (Sandbox Code Playgroud)

输出:

    A         B       C      D
0   True    True    False   True
1   True    False   True    True
Run Code Online (Sandbox Code Playgroud)