"使用pandas数据帧作为查找表"

2024-10-01 17:23:36 发布

您现在位置:Python中文网/ 问答频道 /正文

给定dataframeX中的一行,从dataframeY中检索与查询行完全匹配的所有行的最有效方法是什么?在

示例:从查询[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],
]

应该回来

^{pr2}$

假定X和{}具有相同的架构,只是Y有一个额外的目标值列。可能有一个、零个或多个匹配项。即使有数千个列,该解决方案也应该是有效的。在


Tags: 方法示例架构解决方案目标值pr2dataframexdataframey
3条回答

使用^{}

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列:

^{pr2}$

^{}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

并按^{}检查是否匹配,以检查每行Trues:

print (df.iloc[:, :len(Y)].eq(Y).all(1))
0     True
1     True
2    False
3    False
dtype: bool

我会选择merge

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

相关问题 更多 >

    热门问题