熊猫:合并两个具有重复行的数据框

简短问题 在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。


Pandas中是否有一种方便的方法将一列的值设置为另一个数据帧中的第一个匹配列,以使所有4个条目都包含from中的第一个匹配值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字段上进行。


关于为什么其他行可能未填写的任何想法?


陪伴而非守候
浏览 190回答 1
1回答

慕标琳琳

您可以使用drop_duplicates上subset=['CUSTOMER_FULL_NAME']在merge与how='left'保持所有行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,匹配项将仅具有此唯一名称
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python