简短问题 在Pandas中,合并两个数据框的最便捷方法是什么,以使左侧数据框中的所有条目都从右侧数据框中接收第一个匹配值?
更长的问题
假设我有两个电子表格:people.csv
和orders.csv
。 people.csv
包含有关此人的几列信息,而orders.csv
包含该人的全名,以及该人下达的#个订单行。
我需要创建第三个csv output.csv
,其中包含来自people.csv
的所有列以及来自output.csv
的与两个电子表格中的一个列匹配的列(称为“ FULL_NAME”一个”,另一个“ CUSTOMER_FULL_NAME”)
people.csv
在FULL_NAME字段上排序,但包含重复的行,因此FULL_NAME列中有多个带有“ John Smith”的行。 orders.csv
中也有重复的行,但是重复的数目不同(例如,people.csv
可能有4个John Smith条目,而orders.csv
可能只有两个)。
如果我使用以下代码:
people = pd.read_csv('people.csv')
orders = pd.read_csv('orders.csv')
full = pd.merge(
people,
orders,
left_on='FULL_NAME',
right_on='CUSTOMER_FULL_NAME',
)
result.to_csv("output.csv")
...我得到了一个CSV,其中FULL_NAME字段中只有两个带有“ John Smith”的行具有John Smith的订单数。正下方的行在该字段中没有值。这是因为output.csv
仅包含两行,其行与John Smith匹配,而people.csv
有4行。
Pandas中是否有一种方便的方法将一列的值设置为另一个数据帧中的第一个匹配列,以便所有4个条目都包含orders.csv
中的第一个匹配值?
编辑 我脚本的完整版本,返回的CSV包含未设置预期值的行:
import pandas as pd
community = pd.read_csv("orders.csv")
full = pd.read_csv("people.csv")
result = pd.merge(
full,
community.drop_duplicates(subset=['FULL_NAME'], keep='first'),
left_on="CUSTOMER_FULL_NAME",
right_on="FULL_NAME",
how='left',
)
result.to_csv("output.csv")
因此,我认为我在这里缺少其他内容,因为某些行以预期的方式匹配。这是输出文件中的示例:
ID FULL_NAME EMPLOYER DIVISION ORDER #
7350 John Smith RiteAid Clinical Research 25
7351 John Smith RiteAid Clinical Research 25
7352 John Smith Costco Sales
7353 John Smith Costco Sales
此约翰史密斯行在orders.csv
文件中没有重复的值,因此我认为这是行得通的,因为其中两行都得到了它。但是,我没有在列出Costco而不是RiteAid(或其他不同字段)的John Smith行上找到匹配项。因为我认为索引检查仅在FULL_NAME字段上,这使我感到惊讶。
关于为什么其他行可能无法填写的任何想法?
答案 0 :(得分:2)
您可以在subset=['CUSTOMER_FULL_NAME']
和merge
的{{1}}上的how='left'
上使用drop_duplicates
,以保留people
中的所有行,例如:
full = pd.merge(
people,
orders.drop_duplicates(subset=['CUSTOMER_FULL_NAME'], keep='first'), #here the differance
left_on='FULL_NAME',
right_on='CUSTOMER_FULL_NAME',
how='left' #and add the how='left'
)
因此orders.drop_duplicates(subset=['CUSTOMER_FULL_NAME'], keep='first')
将仅包含每个名称一次,并且在merge
期间,匹配将仅具有该唯一名称