【问题标题】:pandas data frames delta (subtraction)熊猫数据帧增量(减法)
【发布时间】:2015-11-22 22:13:15
【问题描述】:

我有 2 个非索引数据框,如下所示: df1

John   Mullen  12/08/1993
Lisa   Bush    06/12/1990
Maria  Murphy  30/03/1989
Seth   Black   21/06/1991

和 df2

John   Mullen  12/08/1993
Lisa   Bush    06/12/1990
Seth   Black   21/06/1991    
Joe    Maher   28/09/1990
Debby  White   03/01/1992

我想要一个数据增量,其中只有 df2 而不是 df1 中的记录会出现:即

Joe    Maher   28/09/1990
Debby  White   03/01/1992

我有办法做到这一点吗? 我尝试了内部联接,但找不到从 df2 中减去它的方法。

非常感谢任何帮助。

【问题讨论】:

    标签: python pandas


    【解决方案1】:

    您可以将列表推导与join 一起使用来创建每个表的唯一键,其中包括名字、姓氏和日期字段(我假设是出生日期)。如果还没有,则每个字段都需要转换为字符串。

    然后,您将另一个列表推导与 enumerate 一起使用,以获取 key2 中不也在 key1 中的每个键的索引位置。

    最后,使用iloc根据上一步的索引获取df2中的所有行。

    df1 = pd.DataFrame({'First': {0: 'John', 1: 'Lisa', 2: 'Maria', 3: 'Seth'},
                        'Last': {0: 'Mullen', 1: 'Bush', 2: 'Murphy', 3: 'Black'},
                        'dob': {0: '12/08/1993', 1: '06/12/1990', 2: '30/03/1989', 3: '21/06/1991'}})
    
    df2 = pd.DataFrame({'First': {0: 'John', 1: 'Lisa', 2: 'Seth', 3: 'Joe', 4: 'Debby'},
                        'Last': {0: 'Mullen', 1: 'Bush', 2: 'Black', 3: 'Maher', 4: 'White'},
                        'dob': {0: '12/08/1993', 1: '06/12/1990',  2: '21/06/1991',  3: '28/09/1990',  4: '03/01/1992'}})
    
    key1 = ["".join([first, last, dob]) 
            for first, last, dob in zip(df1.First, df1.Last, df1.dob)]
    
    key2 = ["".join([first, last, dob]) 
            for first, last, dob in zip(df2.First, df2.Last, df2.dob)]
    
    idx = [n for n, k in enumerate(key2) 
           if k not in key1]
    
    >>> df2.iloc[idx, :]
       First   Last         dob
    3    Joe  Maher  28/09/1990
    4  Debby  White  03/01/1992
    

    假设您的数据框中没有任何其他列,您可以按照@SebastianWozny 的建议使用drop_duplicates。但是,您只需要选择添加的新行(不是df1)。你可以这样做:

    >>> df1.append(df2).drop_duplicates().iloc[df1.shape[0]:, :]
       First   Last         dob
    3    Joe  Maher  28/09/1990
    4  Debby  White  03/01/1992
    

    【讨论】:

    • 我现在正在学习熊猫。您是如何如此快速地创建样本数据的?这是一个众所周知的例子df吗?
    • 在这种情况下,df1 = pd.read_clipboard(names=['First', 'Last', 'dob'])。顺便说一句,我正要支持你的回复,但你已经删除了它。我现在就这样做。哦,然后df1.to_dict() 获取字典表示。
    【解决方案2】:

    您可以附加两个框架并使用drop_duplicates 来获取唯一的行,然后按照@Alexander 的建议,您可以使用iloc 来获取您想要的行:

    df1 = pd.DataFrame({'First': {0: 'John', 1: 'Lisa', 2: 'Maria', 3: 'Seth'},
                        'Last': {0: 'Mullen', 1: 'Bush', 2: 'Murphy', 3: 'Black'},
                        'dob': {0: '12/08/1993', 1: '06/12/1990', 2: '30/03/1989', 3: '21/06/1991'}})
    
    df2 = pd.DataFrame({'First': {0: 'John', 1: 'Lisa', 2: 'Seth', 3: 'Joe', 4: 'Debby'},
                        'Last': {0: 'Mullen', 1: 'Bush', 2: 'Black', 3: 'Maher', 4: 'White'},
                        'dob': {0: '12/08/1993', 1: '06/12/1990',  2: '21/06/1991',  3: '28/09/1990',  4: '03/01/1992'}})
    >>> df1.append(df2).drop_duplicates()
       First    Last         dob
    0   John  Mullen  12/08/1993
    1   Lisa    Bush  06/12/1990
    2  Maria  Murphy  30/03/1989
    3   Seth   Black  21/06/1991
    3    Joe   Maher  28/09/1990
    4  Debby   White  03/01/1992
    >>> df1.append(df2).drop_duplicates().iloc[df1.shape[0]:, :]
       First   Last         dob
    3    Joe  Maher  28/09/1990
    4  Debby  White  03/01/1992
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-01-31
      • 2021-01-05
      • 1970-01-01
      • 2013-12-10
      • 2020-07-06
      • 2022-01-17
      • 1970-01-01
      相关资源
      最近更新 更多