У меня есть 2 кадра данных, которые я хочу сравнить один с другим и добавить «True / False» в новый столбец в первом на основе сравнения.

Мои данные похожи:

DF1 :

        cat  sub-cat    low       high
3       3        1      208       223
4       3        1      224       350
8       4        1      223       244
9       4        1      245       350
13      5        1      232       252
14      5        1      253       350

DF2 :

      Cat   Sub-Cat   Rating
0     5      1           246
1     5      2           239
2     8      1           203
3     8      2           218
4     K      1           149
5     K      2           165
6     K      1           171
7     K      2           185
8     K      1           157
9     K      2           171

Желательно, чтобы DF2 имел дополнительный столбец с True или False, в зависимости от того, находится ли рейтинг, основанный на значениях cat и sub-cat, между low.min () и high.max () или Null, если нет совпадения найдены для сравнения.

Слишком долго бегали с этим безрезультатно.

Заранее благодарю за любую помощь.

Обновление:

Первый ряд будет выглядеть примерно так:

      Cat   Sub-Cat   Rating  In-Spec
0     5      1           246    True

Как это попадает в минимальный минимум и максимальный максимум.

Пример: в DF1 есть две строки для cat = 5 и sub-cat = 2. Мне нужно получить минимальный минимум и максимальный максимум из этих 2 строк, а затем проверить, попадает ли оценка из строки 0 в DF2 в минимальный минимум и максимальный максимум из двух совпадающих строк в DF1

0
bmeredith 12 Янв 2017 в 00:16

3 ответа

Лучший ответ

join сообщение groupby.agg

d2 = DF2.join(
    DF1.groupby(
        ['cat', 'sub-cat']
    ).agg(dict(low='min', high='max')),
    on=['Cat', 'Sub-Cat']
)
d2

  Cat  Sub-Cat  Rating   high    low
0   5        1     246  350.0  232.0
1   5        2     239    NaN    NaN
2   8        1     203    NaN    NaN
3   8        2     218    NaN    NaN
4   K        1     149    NaN    NaN
5   K        2     165    NaN    NaN
6   K        1     171    NaN    NaN
7   K        2     185    NaN    NaN
8   K        1     157    NaN    NaN
9   K        2     171    NaN    NaN

назначить с .loc

DF2.loc[d2.eval('low <= Rating <= high'), 'In-Spec'] = True
DF2

  Cat  Sub-Cat  Rating In-Spec
0   5        1     246    True
1   5        2     239     NaN
2   8        1     203     NaN
3   8        2     218     NaN
4   K        1     149     NaN
5   K        2     165     NaN
6   K        1     171     NaN
7   K        2     185     NaN
8   K        1     157     NaN
9   K        2     171     NaN
2
piRSquared 11 Янв 2017 в 21:54

Вы можете сделать это так

df2['In-Spec'] = 'False'
df2['In-Spec'][(df2['Rating'] > df1['low']) & (df2['Rating'] < df1['high'])] = 'True'

Но какие строки следует сравнивать друг с другом? Вы хотите, чтобы они сравнивали по индексу или по именам кошек и подкаталогов?

0
baermathias 11 Янв 2017 в 21:50

Чтобы добавить новый столбец на основе логического выражения, нужно что-то вроде:

temp = boolean code involving inequality
df2['new column name'] = temp

Однако я не уверен, что понимаю, например, первая строка в вашей таблице DF2 имеет рейтинг 246, что означает, что это верно для строки 13 DF1, но неверно для строки 14. Что бы вы хотели вернуть?

0
Josh Kidd 11 Янв 2017 в 21:25