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

时间:2018-08-14 16:29:14

标签: python pandas csv

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

更长的问题 假设我有两个电子表格:people.csvorders.csvpeople.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   

此约翰史密斯行在orders.csv文件中没有重复的值,因此我认为这是行得通的,因为其中两行都得到了它。但是,我没有在列出Costco而不是RiteAid(或其他不同字段)的John Smith行上找到匹配项。因为我认为索引检查仅在FULL_NAME字段上,这使我感到惊讶。

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

1 个答案:

答案 0 :(得分:2)

您可以在subset=['CUSTOMER_FULL_NAME']merge的{​​{1}}上的how='left'上使用drop_duplicates,以保留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期间,匹配将仅具有该唯一名称