[英]Using a pandas dataframe as a lookup table
給定數據幀X
單行,從數據框Y
中檢索與查詢行完全匹配的所有行的最有效方法是什么?
示例: [0,1,0,1]
查詢行[0,1,0,1]
[
[0,1,0,1, 1.0],
[0,1,0,1, 2.0],
[0,1,0,0, 3.0],
[1,1,0,0, 0.5],
]
應該回來
[
[0,1,0,1, 1.0],
[0,1,0,1, 2.0],
]
假設X
和Y
具有相同的模式,除了Y
具有附加目標值列。 可能有一個,零個或多個匹配。 即使有數千列,該解決方案也應該是高效的。
使用boolean indexing
:
L = [
[0,1,0,1, 1.0],
[0,1,0,1, 2.0],
[0,1,0,0, 3.0],
[1,1,0,0, 0.5],
]
df = pd.DataFrame(L)
Y = [0,1,0,1]
print (df[df.iloc[:, :len(Y)].eq(Y).all(axis=1)])
0 1 2 3 4
0 0 1 0 1 1.0
1 0 1 0 1 2.0
說明 :
首先按序列長度選擇前N
列:
print (df.iloc[:, :len(Y)])
0 1 2 3
0 0 1 0 1
1 0 1 0 1
2 0 1 0 0
3 1 1 0 0
比較eq
和loc
選擇的第一行的所有行:
print (df.iloc[:, :len(Y)].eq(Y))
0 1 2 3
0 True True True True
1 True True True True
2 True True True False
3 False True True False
並檢查是否匹配DataFrame.all
以檢查每行的所有True
:
print (df.iloc[:, :len(Y)].eq(Y).all(1))
0 True
1 True
2 False
3 False
dtype: bool
我會選擇合並 :
import pandas as pd
y = pd.DataFrame({'A': [1, 1, 3],
'B': list('aac'),
'C': list('ddf'),
'D': [4, 5, 6]})
x = pd.DataFrame([[1, 'a', 'd']],
columns=list('ABC'))
match = x.merge(y, on=x.columns.tolist())
match
# A B C D
#0 1 a d 4
#1 1 a d 5
一種有效的方法是下拉到numpy
並查詢單個列:
來自@jezrael的數據。
import pandas as pd, numpy as np
df = pd.DataFrame({'A':list('abadef'),
'B':[4,5,4,5,5,4],
'C':[7,8,7,4,2,3],
'D':[1,3,1,7,1,0],
'E':[5,3,5,9,2,4],
'F':list('aaabbb')})
vals = df.values
arr = [4, 7, 1, 5]
mask = np.logical_and.reduce([vals[:, i+1]==arr[i] for i in range(len(arr))])
res = df.iloc[np.where(mask)[0]]
print(res)
# A B C D E F
# 0 a 4 7 1 5 a
# 2 a 4 7 1 5 a
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.