检查panda数据帧中的多个列是否重合并在新列中标记它们
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了检查panda数据帧中的多个列是否重合并在新列中标记它们相关的知识,希望对你有一定的参考价值。
我有两个数据帧,其中一些行是相同的。我要做的是检查任何行在另一个数据帧的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,但是我没有得到它,我没有使用词典。
如果这是一个非常棒的问题,请提前和谢谢。
我使用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”。
以上是关于检查panda数据帧中的多个列是否重合并在新列中标记它们的主要内容,如果未能解决你的问题,请参考以下文章
从 Spark DataSet 中的单个列派生多个列并在新列上分组 [重复]
Pandas str.contains - 在字符串中搜索多个值并在新列中打印值[重复]