在Pandas中选择两个DataFrame之间的唯一行

9 投票
1 回答
16219 浏览
提问于 2025-04-18 05:21

我有两个数据框,A和B,它们的大小不一样。我想创建一个新的数据框C,这个数据框里只包含在A和B之间独特的行,也就是说,C里不应该有A和B中重复的行。我试着按照这个解决方案来做(根据列值排除Pandas数据框中的行,而不是索引值),但是没能成功。

这里有个例子:

假设DF_A是这样的:

    Star_ID         Loc_ID      pmRA        pmDE    Field     Jmag    Hmag  
 2M00000032+5737103  4264    0.000000    0.000000    N7789   10.905  10.635
 2M00000068+5710233  4264    8.000000    -18.000000  N7789   10.664  10.132
 2M00000222+5625359  4264    0.000000    0.000000    N7789   11.982  11.433
 2M00000818+5634264  4264    0.000000    0.000000    N7789   12.501  11.892
 2M00001242+5524391  4264    0.000000    -4.000000   N7789   12.091  11.482

而DF_B是这样的:

2M00000032+5737103  
2M00000068+5710233
2M00001242+5524391

在DF_A和DF_B中,前两行和最后一行的Star_ID是相同的。我想创建DF_C,使得:

DF_C:

        Star_ID         Loc_ID      pmRA        pmDE    Field     Jmag    Hmag
     2M00000222+5625359  4264    0.000000    0.000000    N7789   11.982  11.433
     2M00000818+5634264  4264    0.000000    0.000000    N7789   12.501  11.892

1 个回答

15

这个方法对我有效:

In [7]:

df1[~df1.Star_ID.isin(df2.Star_ID)]

Out[7]:

              Star_ID  Loc_ID  pmRA  pmDE  Field    Jmag    Hmag
2  2M00000222+5625359    4264     0     0  N7789  11.982  11.433
3  2M00000818+5634264    4264     0     0  N7789  12.501  11.892

[2 rows x 7 columns]

这里我们做的是创建一个布尔掩码,也就是一个条件判断,看看Star_ID的值在两个数据框中是否都存在。不过通过使用~,我们实际上是在反转这个条件,也就是取反。你链接的那个方法基本上是一样的,但我觉得你可能没有理解语法?

编辑

如果你想获取只在df1中的值和只在df2中的值,可以这样做:

unique_vals = df1[~df1.Star_ID.isin(df2.Star_ID)].append(df2[~df2.Star_ID.isin(df1.Star_ID)], ignore_index=True)

进一步编辑

问题出在csv文件里有多余的空格,这导致两个数据集中的所有值都是唯一的。要解决这个问题,你需要这样做:

df1.Apogee_ID = df1.Apogee_ID.str.lstrip()

撰写回答