Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/344.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/xpath/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 根据不同数据帧中的多个条件删除数据帧的行_Python_Pandas - Fatal编程技术网

Python 根据不同数据帧中的多个条件删除数据帧的行

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']

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

我会使用pandas
merge
和一个小技巧:

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中没有左外合并,只有“左”、“右”、“外部”、“内部”,默认值为“内部”。最后一行做到了。合并与日期索引混淆,或者返回空数据帧。最后一行就做到了。合并与日期索引混淆,或者返回空数据帧。