pandas 如何为DataFrame的每一行应用不同的isin?

carvr3hs  于 2023-06-04  发布在  其他
关注(0)|答案(3)|浏览(149)

我有两个数组,想比较行。特别地,我想检查arr2中的每个元素是否在arr1中的相应行中。
给出的示例

arr1 = [[1, 7, 6, 2, 8],
        [1, 5, 4, 8],
        [8, 2, 5]]

arr2 = [[8, 1, 5, 0, 7, 2, 9, 4],
        [0, 1, 8, 5, 3, 4, 7, 9],
        [9, 2, 0, 6, 8, 5, 3, 7]]

arr2第一行的预期结果

[1, 1, 0, 0, 1, 1, 0, 0]

用for循环求解

d1 = pd.DataFrame(arr1)
d2 = pd.DataFrame(arr2)

for y in range(len(arr1)):
    print(d2.iloc[y].isin(d1.iloc[y]).astype(int).tolist())

如何在pandas中做到这一点而不迭代行?

czq61nw1

czq61nw11#

你可以用一个for循环通过列表解析来完成。

arr1 = [[1, 7, 6, 2, 8],
        [1, 5, 4, 8],
        [8, 2, 5]]

arr2 = [[8, 1, 5, 0, 7, 2, 9, 4],
        [0, 1, 8, 5, 3, 4, 7, 9],
        [9, 2, 0, 6, 8, 5, 3, 7]] 

[1 if x in arr1[0] else 0 for x in arr2[0]]

#output
[1, 1, 0, 0, 1, 1, 0, 0]

Pandas解决方案:

import pandas as pd
d1 = pd.DataFrame(arr1)
d2 = pd.DataFrame(arr2)
d2.iloc[0].isin(d1.iloc[0]).astype(int).tolist()

#output
[1, 1, 0, 0, 1, 1, 0, 0]

对于所有行:

for y in range(len(arr1)):
    print(d2.iloc[y].isin(d1.iloc[y]).astype(int).tolist())

[1, 1, 0, 0, 1, 1, 0, 0]
[0, 1, 1, 1, 0, 1, 0, 0]
[0, 1, 0, 0, 1, 1, 0, 0]
rseugnpd

rseugnpd2#

如果你***不想使用for循环并迭代行***,那么你可以这样做:

arr1 = [[1, 7, 6, 2, 8],
        [1, 5, 4, 8],
        [8, 2, 5]]

arr2 = [[8, 1, 5, 0, 7, 2, 9, 4],
        [0, 1, 8, 5, 3, 4, 7, 9],
        [9, 2, 0, 6, 8, 5, 3, 7]]

import pandas as pd
d1 = pd.DataFrame(arr1)
d2 = pd.DataFrame(arr2)

#for 1st row you can do:

d2.apply(lambda x: x[0]).isin(d1.iloc[0]).astype(int).tolist()
#[1, 1, 0, 0, 1, 1, 0, 0]

对于所有行,使用map而不是列表解析:

list(map(lambda r: d2.apply(lambda x: x[r]).isin(d1.iloc[r]).astype(int).tolist(), range(len(arr1))))

#output
[[1, 1, 0, 0, 1, 1, 0, 0], [0, 1, 1, 1, 0, 1, 0, 0], [0, 1, 0, 0, 1, 1, 0, 0]]
irlmq6kh

irlmq6kh3#

下面是一个不迭代行的解决方案。df.isin()可以接受一个字典,其中的键必须是列名。
编辑:我刚刚注意到下面的解决方案与Timus的评论几乎相同

pd.DataFrame(arr2).T.isin(dict(enumerate(arr1))).astype(int).T.to_numpy()

另外,这里有一个列表理解的方法:

[[int(i in a1) for i in a2] for a1,a2 in zip(arr1,arr2)]

输出:

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

相关问题