我有两个大数据框,我想在第二个中匹配第一个和两个标准。
但是,我希望第一个标准与第二个相关列中的所有值匹配,而我希望从第二个标准的特定行中提取第二个标准并匹配第一个标准的特定值。
我不想将所有值从第二个值覆盖到第一个值,只有当它们符合特定条件时。在下面的示例中,我想在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)
编辑:要注意我实际情况中的两个数据帧的长度不同。
答案 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