使用行来构造pandas数据帧,条件是它们不存在于另一个数据帧python中

时间:2014-11-11 19:43:12

标签: python pandas dataframe missing-data

我有一个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      

3 个答案:

答案 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)]