我正在尝试遍历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列之间的行值是否匹配。然后返回是否匹配。我不完全确定哪种方法是存储比赛结果的最佳方法。
也许使用不同的结构化方法将是有益的。
我提供了一个示例框架,如果可以正确执行,它应该具有一些匹配项。
感谢您的帮助。
答案 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