我有一个pandas数据帧
df
store day items
a 1 4
a 1 3
a 2 1
a 3 5
a 4 2
a 5 9
b 1 1
b 2 3
我有另一个pandas数据帧temp
这是所有独特的商店日组合的kronecker产品,也就是说,它看起来像:
store day
0 a 1
1 a 2
2 a 3
3 a 4
4 a 5
5 b 1
6 b 2
7 b 3
8 b 4
9 b 5
我想制作一个新的DF,它是df
中缺少的观察结果,即store-day
中不存在但df
中存在的temp
组合。< / p>
desired output
store day
b 3
b 4
b 5
答案 0 :(得分:2)
这是一种方式
gcols = ['store', 'date']
tmp[tmp.set_index(gcols).index.isin(df.set_index(gcols).index) == False]
答案 1 :(得分:2)
我的解决方案合并了两个数据框,并使用items
作为标记列 - 对于我们想要的行,它将是nan
。我相信对于大型数据帧,这比使用isin
的替代方案更有效。如果items
不在那里,我会在df
添加一个标记列。
首先合并。指定how = 'left'
非常重要,以便我们从tmp
获取df
以外的行:
out = tmp.merge(df, on= ['store', 'day'], how = 'left')
In [23]: out
Out[23]:
store day items
0 a 1 4
1 a 1 3
2 a 2 1
3 a 3 5
4 a 4 2
5 a 5 9
6 b 1 1
7 b 2 3
8 b 3 NaN
9 b 4 NaN
10 b 5 NaN
您看到我们想要的行nan
列为items
列,因为它们仅从tmp
合并。现在让我们放下它们,然后摆脱标记列。
out[out['items'].isnull()].drop(['items'], axis = 1)
store day
8 b 3
9 b 4
10 b 5
答案 2 :(得分:0)
newDF = pd.merge(df,temp,how ='right',on = ['store','day'])
newDF [newDF.isnull()。任何(轴= 1)]