Pandas:合并两个具有重复行的数据帧

2024-09-29 23:29:17 发布

您现在位置:Python中文网/ 问答频道 /正文

简短问题 在Pandas中,合并两个数据帧的最方便方法是什么,这样左数据帧中的所有条目都从右数据帧接收第一个匹配值?在

较长的问题 假设我有两个电子表格:people.csv和{}。people.csv包含有关此人的多个信息列,而orders.csv则包含此人的全名和该人所下订单的一行。在

我需要创建第三个csv,output.csv,它包含来自people.csv的所有列,再加上一个来自{}的列,与两个电子表格中的一个列匹配(一个称为“全名”,另一个称为“客户全名”)

people.csv按“全名”字段排序,但包含重复行,因此在“全名”列中有多行带有“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,其中全名字段中只有两行带有“John Smith”的订单数。正下方的行在该字段中没有值。这是因为output.csv只包含了两行与John Smith匹配的值,而people.csv只有4行。在

在Pandas中是否有一种方便的方法将一列的值设置为另一个数据帧中的第一个匹配列,以便所有4个条目都包含来自orders.csv的第一个匹配值?在

编辑 脚本的完整当前版本,返回的CSV包含未设置预期值的行:

^{pr2}$

所以我想我在这里遗漏了一些东西,因为有些行以预期的方式匹配。以下是输出文件中的一个示例:

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文件中没有重复的值,因此我认为这是可行的,因为其中两行得到了它。但是,我没有在列出好市多而不是RiteAid(或其他不同字段)的John Smith行上找到匹配项。这让我很惊讶,因为我以为索引检查只在全名字段上。在

有什么想法可以解释为什么其他行不可以填写?在


Tags: csv数据方法namepandasoutput条目john
1条回答
网友
1楼 · 发布于 2024-09-29 23:29:17

您可以使用merge中的subset=['CUSTOMER_FULL_NAME']上的^{}how='left'一起保留{}中的所有行,例如:

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期间,匹配将只使用这个唯一的名称

相关问题 更多 >

    热门问题