【发布时间】:2018-07-22 19:13:33
【问题描述】:
我有一个包含 3 列(称为 all_names)的数据框。第一列为 ID,第二列为“First_names”,第三列为“Last_names”——数据框有 100 万行。我有一个不同的数据框(称为组合),它有 2 行:“第一”和“最后”。 (数据框也有一个索引列)。我需要同时检查 First_names 和 Last_names 列,以查看它们是否包含另一个数据框中的 first 和 last 的组合。
目前,我有:
all_names['First_names'] = all_names.First_names.astype(str) #setting column to string data type
all_names['Last_names'] = all_names.Last_names.astype(str)
combos['First'] = combos.First.astype(str)
combos['Last'] = combos.Last.astype(str) #setting column to string data type
for index, row in combos.iterrows():
correct_IDS = all_names.loc[all_names.First_names.str.contains(row.First)] & all_names.loc[all_names.Last_names.str.contains(row.Last), 'ID']
print(correct_tiles)
但是,这不起作用并且很混乱,因为必须遍历所有行。任何帮助都会很棒
all_names 看起来像这样(在记事本中打开时):
,ID,First_names,Last_names
0,5231,Harry,Smith
1,2745,Mark,Hammond
组合看起来像这样(在记事本中打开时):
,First,Last
0,Liam,Bradnam
1,James,Beckham
【问题讨论】:
-
使用
iterrows来遍历你的数据框会非常慢。研究一种矢量化任务的方法,以显着提高性能。我的建议是首先在每个数据框中创建一个新列,将名字和姓氏组合成一个字符串,然后您只需比较两个数据框中的两个单独的列。 -
使用
merge解决您的问题可能是一种方法,但没有一些输入数据(两个数据框的几行)和预期的输出(您想在组合中添加一列?)它会很难帮你。 -
好的,我会调查的,只需创建一个系列或列表,其中包含组合文件中名称的所有 ID,我不需要将列添加到组合 @Ben.T
-
你能发布一个实际重叠和期望输出的例子吗?
-
如果我在 all_names 中有 Harry,Smith,在连击中有 Harry,Smith,我希望将该行的 ID 放入列表或系列中。