我是熊猫新手,我正试图解决这个问题: 我有一个包含两个产品的示例DataFrame。 df =
Product_Num Date Description Price
10 1-1-18 Fruit Snacks 2.99
10 1-2-18 Fruit Snacks 2.99
10 1-5-18 Fruit Snacks 1.99
10 1-8-18 Fruit Snacks 1.99
10 1-10-18 Fruit Snacks 2.99
45 1-1-18 Apples 2.99
45 1-3-18 Apples 2.99
45 1-5-18 Apples 2.99
45 1-9-18 Apples 1.49
45 1-10-18 Apples 1.49
45 1-13-18 Apples 1.49
45 1-15-18 Apples 2.99
我还有另一个看起来像这样的小型DataFrame(显示相同产品的促销价格):df2 =
Product_Num Price
10 1.99
45 1.49
请注意,df2不包含“日期”列和“描述”列。我想要做的是使用df1中的数据从df1(对于促销上的所有日期)中删除所有促销价格。做这个的最好方式是什么?
所以,我想看到这个:
Product_Num Date Description Price
10 1-1-18 Fruit Snacks 2.99
10 1-2-18 Fruit Snacks 2.99
10 1-10-18 Fruit Snacks 2.99
45 1-1-18 Apples 2.99
45 1-3-18 Apples 2.99
45 1-5-18 Apples 2.99
45 1-15-18 Apples 2.99
我在考虑在Price和Product_Num列上进行合并,然后看看我能从那里做些什么。但由于多个日期,我感到困惑。
答案 0 :(得分:2)
isin
的 &
df.loc[~((df.Product_Num.isin(df2['Product_Num']))&(df.Price.isin(df2['Price']))),:]
Out[246]:
Product_Num Date Description Price
0 10 1-1-18 FruitSnacks 2.99
1 10 1-2-18 FruitSnacks 2.99
4 10 1-10-18 FruitSnacks 2.99
5 45 1-1-18 Apples 2.99
6 45 1-3-18 Apples 2.99
7 45 1-5-18 Apples 2.99
11 45 1-15-18 Apples 2.99
更新
df.loc[~df.index.isin(df.merge(df2.assign(a='key'),how='left').dropna().index)]
Out[260]:
Product_Num Date Description Price
0 10 1-1-18 FruitSnacks 2.99
1 10 1-2-18 FruitSnacks 2.99
4 10 1-10-18 FruitSnacks 2.99
5 45 1-1-18 Apples 2.99
6 45 1-3-18 Apples 2.99
7 45 1-5-18 Apples 2.99
11 45 1-15-18 Apples 2.99
答案 1 :(得分:0)
使用Product_Num
作为两个Dataframe的索引,您可以从df1
删除df2
的索引,然后连接数据框:
import pandas as pd
df1 = pd.DataFrame({'Product_Num':[1,2,3,4], 'Date': ['01/01/2012','01/02/2013','02/03/2013','04/02/2013'], 'Price': [10,10,10,10]})
df1 = df1.set_index('Product_Num')
df2 = pd.DataFrame({'Product_Num':[2], 'Date':['03/3/2012'], 'Price': [5]})
df2 = df2.set_index('Product_Num')
删除并连接:
df_new = df1.drop(df2.index)
df_new = pd.concat([df_new, df2])
结果:
Date Price
Product_Num
1 01/01/2012 10
3 02/03/2013 10
4 04/02/2013 10
2 03/3/2012 5
答案 2 :(得分:0)
您可以将df2
转换为字典,然后过滤掉df1
df[df[df2.columns].isin(df2.to_dict('list')).sum(1) <= 1]
Yeilds
Date Description Price Product_Num
0 1-1-18 Fruit Snacks 2.99 10
1 1-2-18 Fruit Snacks 2.99 10
4 1-10-18 Fruit Snacks 2.99 10
5 1-1-18 Apples 2.99 45
6 1-3-18 Apples 2.99 45
7 1-5-18 Apples 2.99 45
11 1-15-18 Apples 2.99 45
答案 3 :(得分:0)
可爱又可读
promo_prices = df2['Price']
promo_prods = df2['Product_Num']
no_pro = df
for price, prod in zip(promo_prices, promo_prods):
no_pro = no_pro.where(df != (price or prod)).dropna()