从Pandas Dataframe中删除特定行

时间:2015-04-16 23:02:01

标签: python dictionary pandas

我有一个非常大的数据框,我正在尝试清理。以下是数据框的示例。

[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作为键,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

2 个答案:

答案 0 :(得分:1)

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

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

它通过store_nbr拆分DataFrame,在每个组上调用is_good(应用)以确定要保留的行,以正确的顺序将所有内容放回原处,然后从原始帧中获取行的子集。

答案 1 :(得分: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中的商品。)