我有两个行中相同的数据框。我想做的是检查其他数据框的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,但我不明白,我不使用字典。
如果这是一个菜鸟问题,请先谢谢。
答案 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”。