我有两个大型数据框。第一个包含数据,由日期列和位置列组成,然后是几个数据列。第二个DataFrame由日期列和位置列组成。我要删除df1的日期和位置与df2匹配的所有行。
我尝试了几种方法来解决此问题,包括drop语句,for循环内的drop语句以及根据多种条件重新定义数据框。它们都不起作用
date = pd.to_datetime(['2019-01-01','2019-01-01','2019-01-02','2019-01-02','2019-01-03','2019-01-03'],format='%Y-%m-%d')
location = [1,2,1,2,1,2]
nr = [8,10,15,2,20,38]
df1 = pd.DataFrame(columns=['date','location','nr'])
df1['date']=date
df1['location']=location
df1['nr']=nr
这将导致以下数据框:
date location nr
0 2019-01-01 1 8
1 2019-01-01 2 10
2 2019-01-02 1 15
3 2019-01-02 2 2
4 2019-01-03 1 20
5 2019-01-03 2 38
第二个数据帧:
date2 = pd.to_datetime(['2019-01-01','2019-01-02'],format='%Y-%m-%d')
location2 = [2,1]
df2 = pd.DataFrame(columns=['date','location'])
df2['date']=date2
df2['location']=location2
产生以下数据框:
date location
0 2019-01-01 2
1 2019-01-02 1
然后放置语句:
for i in range(len(df2)):
dayA = df2['date'].iloc[i]
placeA = df2['location'].iloc[i]
df1.drop(df1.loc[(df1['date']==dayA)& (df1['location']==placeA)],inplace=True)
在这种情况下,在示例中导致错误代码: KeyError:“在轴上找不到[['date''location''nr']” 但是在我较大的数据框中会导致错误: TypeError:“ NoneType”对象不可迭代
但是我需要的是
date location nr
0 2019-01-01 1 8
3 2019-01-02 2 2
4 2019-01-03 1 20
5 2019-01-03 2 38
我在做什么错
答案 0 :(得分:0)
使用熊猫合并: 这应该起作用
df1['index_col'] = df1.index
df = df1.merge(df2,on=['date','location'],how='left')
df = df.dropna()
df = df[df1.columns]
result_df = df1[~df.index_col.isin(df1.index_col)]
答案 1 :(得分:0)
我会用熊猫merge
和一些小技巧:
df2['temp'] = 2
df = pd.merge(df1, df2, how='outer', on=['date', 'location'])
df = df[pd.isna(df.temp)]
del df['temp']
答案 2 :(得分:0)
问题在于这一行:
df1.drop(df1.loc[(df1['date']==dayA)& (df1['location']==placeA)],inplace=True)
您可以这样实现目标:
df1 = df1.loc[~((df1['date']==dayA) & (df1['location']==placeA))]
基本上,每次找到每行的匹配项时,实际上就将其从df1
数据框中删除。
输出:
date location nr
0 2019-01-01 1 8
3 2019-01-02 2 2
4 2019-01-03 1 20
5 2019-01-03 2 38
答案 3 :(得分:0)
df1.loc[(df1['date']==dayA)& (df1['location']==placeA)]
是数据框,由日期和位置匹配的行组成。 drop
期望它们匹配的 index 。因此,您需要df1.loc[(df1['date']==dayA)& (df1['location']==placeA)].index
。但是,这是一种非常低效的方法。您可以使用merge
代替其他答案。另一种方法是df1 = df1.loc[~df1[['date','location']].apply(tuple,axis=1).isin(zip(df2.date,df2.location))]
。