检查panda数据帧中的多个列是否重合并在新列中标记它们

问题描述 投票:0回答:1

我有两个数据帧,其中一些行是相同的。我要做的是检查任何行在另一个数据帧的3列中是否具有相同的3个值,向我创建的列添加特定标签。每个数据帧中的行的顺序不同。

我尝试了我能想到的唯一方法。我在另一篇关于合并的类似文章中看到过,但由于行数不同,它似乎没有用。

for i in range((df.shape[0])):
    if df[i][0] and df[i][1] and df [i][3] == Bid.iterrow():
        df[i][4]= 'pep'

数据框的玩具集,以显示它们的构造方式:

2  SC_201916_S1             100   eur           5651.0  kr  Other
3  SC_201916_S1             100   aus           5651.0  Chi  Other
4  SC_201915_S1             45    io            5538.0  CH  Other


2  SC_201838       100      MW         23455.0    CHF/MW
3  SC_201829       100      MW         22345.0    CHF/MW
4  SC_201830       78       MW         21238.0    CHF/MW

我希望这段代码能够检查第1,2和4列是否与数据框'bid'中的值相同,以便在第5列中写入'pep'。它只说keyerror:0,但是我没有得到它,我没有使用词典。

如果这是一个非常棒的问题,请提前和谢谢。

python pandas csv dataframe
1个回答
0
投票

我使用pandas.DataFrame.merge()为您提供解决方案。

首先让我创建虚拟DataFrames来展示它是如何工作的。我们将加入第一和第二列。他们处于“错误的秩序”。

first = pd.DataFrame([['b', 'a', 'c'], [2, 1, 3], ['is', 'this', 'not_important']]).T
second = pd.DataFrame([['a', 'b', 'd'], [1, 4, 3], ['this', 'is', 'not_important']]).T

然后,“标记”列0和1在第二列中显示相同值的行:

first['pep_col'] = np.where(first.merge(second, how='left', left_on=[0, 1], right_on=[0, 1], suffixes=('', '_other'))['2_other'].notna(), 'pep', 'not_pep')

这允许我们用“pep”标记在第二个DataFrame中找到的任何内容。


上面的解决方案假设,您感兴趣的列上的第二个DataFrame中没有重复项,即它存在为一个或不存在。否则你也需要删除重复项:

first['pep_col'] = np.where(first.merge(second, how='left', left_on=[0, 1], right_on=[0, 1], suffixes=('', '_other')).drop_duplicates(first.columns)['2_other'].notna(), 'pep', 'not_pep')

如果您无法确保任何一个数据帧在重要列上没有重复项,那么如果给定的行属于第二个DataFrame中的值,我们可以检查第一个DataFrame中的所有行:

first['join_col'] = tuple(zip(first[0], first[1]))
second['join_col'] = tuple(zip(second[0], second[1]))
set(second['join_col'].tolist())
first['pep_col'] = np.where([val in set(second['join_col'].tolist()) for val in first['join_col'].tolist()], 'pep', 'no_pep')

可能您希望在标记列创建后从两个DataFrame中删除“join_col”。

© www.soinside.com 2019 - 2024. All rights reserved.