我有两个数据帧:
df1 = row1;row2;row3
df2 = row4;row5;row6;row2
Run Code Online (Sandbox Code Playgroud)
我希望我的输出数据帧只包含df1中唯一的行,即:
df_out = row1;row3
Run Code Online (Sandbox Code Playgroud)
我如何最有效地获得这个?
这段代码做我想要的,但使用2个for循环:
a = pd.DataFrame({0:[1,2,3],1:[10,20,30]})
b = pd.DataFrame({0:[0,1,2,3],1:[0,1,20,3]})
match_ident = []
for i in range(0,len(a)):
found=False
for j in range(0,len(b)):
if a[0][i]==b[0][j]:
if a[1][i]==b[1][j]:
found=True
match_ident.append(not(found))
a = a[match_ident]
Run Code Online (Sandbox Code Playgroud)
jez*_*ael 13
您可以使用merge参数indicator和外部联接,query进行过滤,然后使用以下命令删除帮助列drop:
DataFrames连接在所有列上,因此on可以省略参数.
print (pd.merge(a,b, indicator=True, how='outer')
.query('_merge=="left_only"')
.drop('_merge', axis=1))
0 1
0 1 10
2 3 30
Run Code Online (Sandbox Code Playgroud)
unu*_*tbu 10
您可以将a和转换b为Indexs,然后使用该Index.isin方法来确定哪些行是共享的:
import pandas as pd
a = pd.DataFrame({0:[1,2,3],1:[10,20,30]})
b = pd.DataFrame({0:[0,1,2,3],1:[0,1,20,3]})
a_index = a.set_index([0,1]).index
b_index = b.set_index([0,1]).index
mask = ~a_index.isin(b_index)
result = a.loc[mask]
print(result)
Run Code Online (Sandbox Code Playgroud)
产量
0 1
0 1 10
2 3 30
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
7431 次 |
| 最近记录: |