根据不同条件从不同数据框删除数据框的行

时间:2019-08-19 16:33:44

标签: python pandas

我有两个大型数据框。第一个包含数据,由日期列和位置列组成,然后是几个数据列。第二个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

我在做什么错

4 个答案:

答案 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))]