[英]How to use isin (without merge) for multiple dataframe columns
我有两个数据框:
df1
Company Symbol ID Date Value
0 AAA Inc A 123 2019-12-31 10
1 AAA Inc A 123 2020-03-30 11
2 BBB Inc B 456 2019-03-31 12
3 FFF Inc F 653 2019-06-31 22
4 ZZZ Inc Z 999 2019-03-30 13
df2
Company Symbol ID Date Price
0 AAA Inc A 123 2019-12-31 10
1 AAA Inc A 123 2019-09-30 20
2 AAA Inc A 123 2019-06-31 30
3 AAA Inc A 123 2019-03-30 40
4 BBB Inc B 456 2019-12-31 50
5 BBB Inc B 456 2019-09-30 50
6 BBB Inc B 456 2019-06-31 90
7 BBB Inc B 456 2019-03-31 10
8 CCC Inc C 789 2019-12-31 79
9 CCC Inc C 789 2019-09-31 43
我想创建第三个 dataframe ,它是df1
中的所有['Symbol', 'ID', 'Date']
行,但不在df2
中。 所以 output 看起来像这样:
Company Symbol ID Date
0 AAA Inc A 123 2020-03-30
1 FFF Inc F 653 2019-06-31
2 ZZZ Inc Z 999 2019-03-30
我知道我可以做类似df3 = df1[~df1['Symbol'].isin(df2['Symbol'])]
的事情,但是在做了一些研究之后,似乎没有一个好方法可以将isin
与多个列。
我也检查了类似的问题,但没有发现任何只针对特定列的内容。
如果可能的话,我还想避免合并两个数据框。
那么我将如何实现这一目标?
因为你想在这里避免merge
,所以一种可能的解决方案是通过Index.isin
MultiIndex
cols = ['Symbol', 'ID', 'Date']
df3 = df1[~df1.set_index(cols).index.isin(df2.set_index(cols).index)]
print (df3)
Company Symbol ID Date Value
1 AAA Inc A 123 2020-03-30 11
3 FFF Inc F 653 2019-06-31 22
4 ZZZ Inc Z 999 2019-03-30 13
或者将列转换为元组:
cols = ['Symbol', 'ID', 'Date']
df3 = df1[~df1[cols].apply(tuple, 1).isin(df2[cols].apply(tuple, 1))]
对于与merge
和indicator
参数比较解决方案:
cols = ['Symbol', 'ID', 'Date']
df3 = (df1.merge(df2, on=cols, indicator=True, how='left', suffixes=('','_'))
.query("_merge == 'left_only'")[df1.columns])
print (df3)
Company Symbol ID Date Value
1 AAA Inc A 123 2020-03-30 11
3 FFF Inc F 653 2019-06-31 22
4 ZZZ Inc Z 999 2019-03-30 13
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.