匹配所有和行特定值的pandas值

时间:2018-05-22 15:43:46

标签: python pandas apply

我有两个大数据框,我想在第二个中匹配第一个和两个标准。

但是,我希望第一个标准与第二个相关列中的所有值匹配,而我希望从第二个标准的特定行中提取第二个标准并匹配第一个标准的特定值。

我不想将所有值从第二个值覆盖到第一个值,只有当它们符合特定条件时。在下面的示例中,我想在df1 ['输出']中覆盖z,但是要保留x。 (这在我更复杂的情况下是有道理的。)

我无法弄清楚如何将其应用于整个数据帧,当然python在尝试将一个值与一个系列进行比较时会发出错误。

这是我的虚拟代码:

import pandas as pd
import numpy as np


criteria1 = np.random.normal(size = 100)
criteria2 = ['y', 'n'] * 50
output = ['z', 'x'] * 50

d = {'criteria1': criteria1, 'criteria2': criteria2}
d1 = {'criteria1': criteria1, 'output': output}
df1 = pd.DataFrame(d1, columns = ['criteria1', 'output'])
df2 = pd.DataFrame(d, columns = ['criteria1', 'criteria2'])

def dbl_match(x, y):
    if ((x['criteria1'] in y['criteria1'].values) & (y['criteria2'] == 'y')):
        temp = 'hit'
    else:
        temp = x['output']
    return(temp)

df1['output'] = df1.apply(dbl_match, 1, y = df2)

编辑:要注意我实际情况中的两个数据帧的长度不同。

1 个答案:

答案 0 :(得分:1)

尝试使用np.select

conditions = [
((df1['criteria1'] in df2['criteria1'].values) & (df2['criteria2'] == 'y'))

]
choices = [
'hit',
]

df1['output'] = np.select(conditions, choices, default = df1['output'])

输出:

    criteria1   output
0   0.126479    hit
1   1.095249    x
2   1.216341    hit
3   -0.935278   x
4   0.088585    hit

每条评论的新代码:

import pandas as pd
import numpy as np


criteria1 = np.random.normal(size = 100)
criteria2 = ['y', 'n'] * 50
output = ['z', 'x'] * 50

d = {'criteria1': criteria1, 'criteria2': criteria2}
d1 = {'criteria1': criteria1, 'output': output}
df1 = pd.DataFrame(d1, columns = ['criteria1', 'output'])
df2 = pd.DataFrame(d, columns = ['criteria1', 'criteria2'])

split_point = len(df2)-90
df2 = df2[0:split_point] #length of df2 is now only 10



conditions = [
((df1['criteria1'].isin(df2['criteria1'].values)) & (df2['criteria2'] == 'y'))

]
choices = [
'hit',
]

df1['output'] = np.select(conditions, choices, default = df1['output'])
df1

新产品:

    criteria1   output
0   0.335414    hit
1   -1.735475   x
2   0.003568    hit
3   -1.212202   x
4   1.007000    hit
5   -0.934410   x
6   -1.767913   hit
7   -0.966843   x
8   0.110457    hit
9   -1.426420   x
10  -0.617043   z
11  0.771105    x
12  0.483416    z
13  0.501804    x
14  -1.791317   z