【发布时间】:2019-01-21 13:54:51
【问题描述】:
小问题 在 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
这个 John Smith 行在 orders.csv 文件中没有重复值,所以我认为这是有效的,因为其中有两行得到了它。但是,我没有在列出 Costco 而不是 RiteAid(或其他不同字段)的 John Smith 行上找到匹配项。这让我感到惊讶,因为我认为索引检查只针对 FULL_NAME 字段。
关于为什么其他行可能无法填写的任何想法?
【问题讨论】: