Проверьте, существует ли значение, используя несколько условий в группе в пандах - PullRequest
0 голосов
/ 06 октября 2018

Вот как выглядит мой фрейм данных.Expected_Output - это мой желаемый / целевой столбец.

   Group  Value1  Value2  Expected_Output
0      1       3       9             True
1      1       7       6             True
2      1       9       7             True
3      2       3       8            False
4      2       8       5            False
5      2       7       6            False

Если любой Value1 == 7 И , если любой Value2 == 9 в пределахучитывая Group, тогда я хочу вернуть True.

Я пытался безрезультатно:

df['Expected_Output']= df.groupby('Group').Value1.isin(7) &  df.groupby('Group').Value2.isin(9)

Примечание: - Можно вывести либо True / False, либо 1/0.

Ответы [ 2 ]

0 голосов
/ 06 октября 2018

Вы можете создать фрейм данных ожидаемого результата по группе, а затем объединить его с исходным фреймом данных.

expected = (
    df.groupby('Group')
    .apply(lambda x: (x['Value1'].eq(7).any() 
                      & x['Value2'].eq(9)).any())
    .to_frame('Expected_Output'))
>>> expected
       Expected_Output
Group                 
1                 True
2                False

>>> df.merge(expected, left_on='Group', right_index=True)
   Group  Value1  Value2  Expected_Output
0      1       3       9             True
1      1       7       6             True
2      1       9       7             True
3      2       3       8            False
4      2       8       5            False
5      2       7       6            False
0 голосов
/ 06 октября 2018

Используйте groupby в столбце Group, а затем используйте transform и lambda function как:

g = df.groupby('Group')
df['Expected'] = (g['Value1'].transform(lambda x: x.eq(7).any()))&(g['Value2'].transform(lambda x: x.eq(9).any()))

Или используйте groupby, apply и merge, используя параметр how='left' as:

df.merge(df.groupby('Group').apply(lambda x: x['Value1'].eq(7).any()&x['Value2'].eq(9).any()).reset_index(),how='left').rename(columns={0:'Expected_Output'})

Или используя groupby, apply и map as:

df['Expected_Output'] = df['Group'].map(df.groupby('Group').apply(lambda x: x['Value1'].eq(7).any()&x['Value2'].eq(9).any()))

print(df)
   Group  Value1  Value2  Expected_Output
0      1       3       9             True
1      1       7       6             True
2      1       9       7             True
3      2       3       8            False
4      2       8       5            False
5      2       7       6            False
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...