遍历列并将该列的每一行值与Pandas中另一列的值进行比较

时间:2019-05-22 19:06:34

标签: python-3.x pandas for-loop while-loop multiple-columns

我正在尝试遍历3列(命名为0,1,2)的范围。在该列的每次迭代中,我想将每个行值与同一帧中称为Flag(相等性的行比较)的另一列进行比较。然后,我想返回匹配的字段。

我要检查值是否匹配。

也许有一种更简单的方法将这些列连接到一个列表中,然后遍历该列表并查看该额外列是否有匹配项?我还不太熟悉Pandas或Numpy。

我正在尝试一种高效的方法,并且我有一个庞大的数据集可以执行此操作。

其中大多数是非常自由的想法,所以我只是尝试许多不同的方法

到目前为止,使用每种列的迭代方法进行了一些尝试:


##Sample Data
df = pd.DataFrame([['123','456','789','123'],['357','125','234','863'],['168','298','573','298'], ['123','234','573','902']])
df = df.rename(columns = {3: 'Flag'})

##Loop to find matches
i = 0

while i <= 2:
    df['Matches'] = df[i].equals(df['Flag'])
    i += 1

我的思维过程是遍历名为0-2的每一列,检查“ Flag”和0-2列之间的行值是否匹配。然后返回是否匹配。我不完全确定哪种方法是存储比赛结果的最佳方法。

也许使用不同的结构化方法将是有益的。

我提供了一个示例框架,如果可以正确执行,它应该具有一些匹配项。

感谢您的帮助。

1 个答案:

答案 0 :(得分:2)

如果列中的任意iloc匹配,则可以将eq.any结合使用而不返回行:

m = df.iloc[:, :-1].eq(df['Flag'], axis=0).any(axis=1)

df['indicator'] = m

     0    1    2 Flag  indicator
0  123  456  789  123       True
1  357  125  234  863      False
2  168  298  573  298       True
3  123  234  573  902      False

您可以通过布尔索引选择返回的结果:

df.iloc[:, :-1].eq(df['Flag'], axis=0)

       0      1      2
0   True  False  False
1  False  False  False
2  False   True  False
3  False  False  False

然后,如果我们将其与any链接起来:

df.iloc[:, :-1].eq(df['Flag'], axis=0).any(axis=1)
0     True
1    False
2     True
3    False
dtype: bool