为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

陪伴而非守候 2021-05-14 18:12:19
简短问题 在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 pdcommunity = 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   257351    John Smith  RiteAid             Clinical Research   257352    John Smith  Costco              Sales   7353    John Smith  Costco              Sales   此约翰史密斯行在orders.csv文件内没有重复的值,因此我认为这是可行的,因为其中两行都得到了它。但是,我没有在列出Costco而不是RiteAid(或其他不同字段)的John Smith行上找到匹配项。这让我感到惊讶,因为我认为索引检查仅在FULL_NAME字段上进行。关于为什么其他行可能未填写的任何想法?
查看完整描述

1 回答

?
慕标琳琳

TA贡献1830条经验 获得超9个赞

您可以使用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,匹配项将仅具有此唯一名称


查看完整回答
反对 回复 2021-05-25
  • 1 回答
  • 0 关注
  • 189 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号