Python 根据不同数据帧中的多个条件删除数据帧的行
我有两个大数据帧。第一个包含数据,包括一个日期列和一个位置列,然后是几个数据列。第二个数据框由日期列和位置列组成。我想删除df1的日期和位置与df2匹配的所有行 我尝试了几种方法来解决这个问题,包括drop语句、for循环中的drop语句以及基于多种条件重新定义dataframe。它们都不起作用Python 根据不同数据帧中的多个条件删除数据帧的行,python,pandas,Python,Pandas,我有两个大数据帧。第一个包含数据,包括一个日期列和一个位置列,然后是几个数据列。第二个数据框由日期列和位置列组成。我想删除df1的日期和位置与df2匹配的所有行 我尝试了几种方法来解决这个问题,包括drop语句、for循环中的drop语句以及基于多种条件重新定义dataframe。它们都不起作用 date = pd.to_datetime(['2019-01-01','2019-01-01','2019-01-02','2019-01-02','2019-01-03','2019-01-03']
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
第二个数据帧:
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
导致以下数据帧:
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
然后是drop语句:
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''位置''nr']未在axis中找到”
但是,在我的较大数据帧中,它会导致以下错误:
TypeError:“非类型”对象不可编辑
然而,我需要的是
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
我做错了什么使用熊猫合并:
这应该行得通
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)]
使用合并:
这应该行得通
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)]
我会使用pandas
merge
和一个小技巧:
df2['temp']=2
df=pd.merge(df1,df2,how='outer',on=['date','location'])
df=df[pd.isna(df.temp)]
del df['temp']
我会使用pandasmerge
和一个小技巧:
df2['temp']=2
df=pd.merge(df1,df2,how='outer',on=['date','location'])
df=df[pd.isna(df.temp)]
del df['temp']
此行存在问题:
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
这条线的问题是:
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
df1.loc[(df1['date']==dayA)和(df1['location']==placeA)]
是由日期和位置匹配的行组成的数据帧drop
需要它们匹配的索引。因此您需要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))
df1.loc[(df1['date']=dayA)和(df1['location'=placeA)]
是由日期和位置匹配的行组成的数据帧drop
需要它们匹配的索引。因此您需要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))
我认为pandasPandas中没有左-外
合并,只有“左”、“右”、“外”、“内”,默认值为“内部”。我认为PandaPandas中没有左外合并,只有“左”、“右”、“外部”、“内部”,默认值为“内部”。最后一行做到了。合并与日期索引混淆,或者返回空数据帧。最后一行就做到了。合并与日期索引混淆,或者返回空数据帧。