检查熊猫数据框中的几列是否重合并将它们标记在新列中

时间:2019-02-05 10:51:54

标签: python pandas csv dataframe

我有两个行中相同的数据框。我想做的是检查其他数据框的3列中是否有任何行具有相同的3个值,并在我创建的列中添加especific标签。每个数据框中的行顺序不相同。

我尝试了唯一能想到的方法。我在另一篇类似的文章中看到了关于合并的信息,但是由于行的顺序不同,所以似乎没有用。

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,但我不明白,我不使用字典。

如果这是一个菜鸟问题,请先谢谢。

1 个答案:

答案 0 :(得分:0)

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

首先让我创建一个虚拟的DataFrame,以展示其工作原理。我们将加入第一列和第二列。他们的顺序不正确。

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”。