pandas数据帧delta(减法)

时间:2015-11-22 22:13:16

标签: python pandas

我有2个非索引数据框如下: DF1

$columns = array(
    array( 'db' => 'id', 'dt' => "id" ),
    array( 'db' => 'name',  'dt' => "Name" ),
    array( 'db' => "CONCAT(`street`, ' ', `city`, '<br>', `postal`, ' ', `country`)", 
            'dt' => "address")
);

和df2

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

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

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中减去它的方法。

非常感谢任何帮助。

2 个答案:

答案 0 :(得分:2)

您可以将列表推导与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

答案 1 :(得分:1)

您可以附加两个框架并使用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