다른 데이터 프레임의 데이터를 기반으로 한 데이터 프레임에서 데이터를 제거하고 싶습니다. 이 작업을 수행하는 방법을 찾았지만 (아래 참조) 더 효율적인 방법이 있는지 궁금합니다. python/pandas에서 왼쪽 내부 조인하는 법?
# -*- coding: utf-8 -*-
import pandas as pd
#df1 is the dataframe where I want to remove data from
d1 = {'one' : [1., 2., 3., 4.], 'two' : [4., 3., 2., 1.], 'three' : [5.,6.,7.,8.] }
df1 = pd.DataFrame(d1)
df1.columns = ['one', 'two', 'three'] #Keeping the order of the columns as defined
print 'df1\n', df1
#print df1
#I want to remove all the rows from df1 that are also in df2
d2 = {'one' : [2., 4.], 'two' : [3., 1], 'three' : [6.,8.] }
df2 = pd.DataFrame(d2)
df2.columns = ['one', 'two', 'three'] #Keeping the order of the columns as defined
print 'df2\n', df2
#df3 is the output I want to get: it should have the same data as df1, but without the data that is in df2
df3 = df1
#Create some keys to help identify rows to be dropped from df1
df1['key'] = df1['one'].astype(str)+'-'+df1['two'].astype(str)+'-'+df1['three'].astype(str)
print 'df1 with key\n', df1
df2['key'] = df2['one'].astype(str)+'-'+df2['two'].astype(str)+'-'+df2['three'].astype(str)
print 'df2 with key\n', df2
#List of rows to remove from df1
rowsToDrop = []
#Building the list of rows to drop
for i in df1.index:
if df1['key'].irow(i) in df2.ix[:,'key'].values:
rowsToDrop.append(i)
#Dropping rows from df1 that are also in df2
for j in reversed(rowsToDrop):
df3 = df3.drop(df3.index[j])
df3.drop(['key'], axis=1, inplace=True)
#Voilà!
print 'df3\n', df3
여러분의 도움에 감사드립니다 : 는 여기에 내가 향상시키고 자하는 코드입니다.
당신이 말할 때'DF3 = df1', 'df3'는'df1'과 *의 변경을 반영합니다. 'df3 = df1.copy()'라고 대신 말해야한다. –
또한이 작업은 실제로 조인 작업이 아닙니다. 그것은 선택입니다. 나는 그것을 반영하기 위해 제목을 편집해야한다고 생각합니다. –
내가하려는 것은이 웹 사이트 http://www.codeproject.com/Articles/33052/Visual-Representation-of-SQL-Joins에서 "left exclude join"을 호출하는 것입니다. –