Совпадение значения панд на всех и конкретных значений строки - PullRequest
0 голосов
/ 22 мая 2018

У меня есть два больших фрейма данных, и я хочу сравнить первое с двумя критериями во втором.

Однако я хочу, чтобы первый критерий соответствовал всем значениям в соответствующем столбце второго, тогда как я хочу, чтобы второй критерий был извлечен из определенной строки второго и сопоставлен с конкретным значениемпервый.

Я не хочу перезаписывать все значения со второго на первое, только когда они соответствуют определенным критериям.В приведенном ниже примере я хотел бы перезаписать z в df1 ['output'], но 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 голосов
/ 22 мая 2018

Попробуйте использовать 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
...