2015-04-16 134 views
0

我有一个非常大的数据框,我正在尝试清理。这是一个数据框的示例。从熊猫数据框中删除特定行

[in]: dftrain 

[out]: 
    date store_nbr item_nbr units  tavg preciptotal 
2012-01-01  1   1   0   42   0.05 
2012-01-01  1   2   2   42   0.05 
2012-01-01  1   3   0   42   0.05 
2012-01-01  1   4   0   42   0.05 

2012-01-01  2   1   0   62   0.15 
2012-01-01  2   2   0   62   0.15 
2012-01-01  2   3   20  62   0.15 
2012-01-01  2   4   1   62   0.15 

2012-01-01  3   1   0   72   1.05 
2012-01-01  3   2   0   72   1.05 
2012-01-01  3   3   29  72   1.05 
2012-01-01  3   3   0   72   1.05 
...(New Day) 
    date  store_nbr item_nbr  units  tavg preciptotal 
2012-01-02  1   1   0   47   0.10 
2012-01-02  1   2   0   47   0.10 
2012-01-02  1   3   0   47   0.10 
2012-01-02  1   4   0   47   0.10 

2012-01-02  2   1   0   60   0.0 
2012-01-02  2   2   0   60   0.0 
2012-01-02  2   3   5   60   0.0 
2012-01-02  2   4   0   60   0.0 

2012-01-02  3   1   0   67   .23 
2012-01-02  3   2   0   67   .23 
2012-01-02  3   3   2   67   .23 
2012-01-02  3   3   0   67   .23 
... 

我有一个字典,str_nbr作为key和item_nbr作为我想要保留的存储和项目编号的值。这里是一个示例字典:{'1': [2], '2': [3,4], '3': [3]} 我想要做的是去商店存储和删除所有行的item_nbr不包含作为我的字典的值。因此,在这个例子中,当我已经放弃了不需要的行我会这样...

[in]: dfrain_drop 

[out]: 
    date store_nbr item_nbr units  tavg preciptotal 

2012-01-01  1   2   2   42   0.05 

2012-01-01  2   3   20  62   0.15 
2012-01-01  2   4   1   62   0.15 

2012-01-01  3   3   29  72   1.05 

...(New Day) 
    date  store_nbr item_nbr  units  tavg preciptotal 

2012-01-02  1   2   0   47   0.10 

2012-01-02  2   3   5   60   0.0 
2012-01-02  2   4   0   60   0.0 

2012-01-02  3   3   0   67   .23 

回答

1

这是最快的解决方案,我能想出:

is_good = lambda group: group.isin(keep[group.name]) 
result = df[df.groupby('store_nbr')['item_nbr'].apply(is_good)] 

它通过store_nbr分裂了数据帧,呼吁is_good每个每个组(应用)来确定要保留的行,将所有内容以正确的顺序放在一起,然后从原始帧中获取行的子集。

0

使用您的样本数据集的第一天:

keep = {'1': [2], '2': [3,4], '3': [3]} 

parts = [] 
for i in keep: parts.append(dftrain.query(
       "item_nbr in %s and store_nbr == %d"%(keep[i],int(i)) 
       )) 
pd.concat(parts) 
  date store_nbr item_nbr units tavg preciptotal 
1 2012-01-01   1   2  2 42   0.05 
10 2012-01-01   3   3  29 72   1.05 
11 2012-01-01   3   3  0 72   1.05 
6 2012-01-01   2   3  20 62   0.15 
7 2012-01-01   2   4  1 62   0.15 

结果,所有一个整理好的数据集。 (我相信你的样本输出从商店3.缺少一个项目)

+0

那实际上并不是我想要的。我想保留不在我的字典中的值。 – Hound

+0

你的OP说“删除所有不包含item_nbr作为我的字典值”的行。 “如果不包含则删除”是“如果包含则保留”;这也符合您的样本结果。无论如何,你可以通过在'query'中使用'not in'而不是'in'来翻转你所保留的内容。 – cphlewis

+0

我看到你编辑了帖子,但它仍然与上面的评论不一致(并且商店3只保留了item_nbr 3行中的一个)。 – cphlewis