在Pandas中选择两个DataFrame之间的唯一行
我有两个数据框,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()