我有一个非常大的数据框,我正在尝试清理。以下是数据框的示例。
[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
答案 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中的商品。)