简短问题 在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 字段。你对为什么其他行可能没有被填充有任何想法吗?
how='left'
了吗?我是在一开始忘记加上去的。 - Ben.Tpeople.csv
表中完全重复的行才会同时接收数据,而在FULL_NAME以外的字段上存在差异的行被视为不同的实体。你也觉得是这样吗? - Robert Townleyfull['FULL_NAME'].str.strip()
或者类似的方法。你的数据中可能存在名字开头或结尾的“隐藏”空格! - Ben.T