Установка значения группы в Pandas Groupby - PullRequest
0 голосов
/ 10 мая 2018

Учитывая пример кадра данных df, при группировке по 'ind' я хочу установить значения в группе на 'Hat', если в группе присутствует 'Hat'. * 1001 то есть *

ind | val              ind | val
----------             ---------
1   | Hat               1  | Hat
1   | Cat               1  | Hat
1   | Cat        - >    1  | Hat
2   | Dog               2  | Dog
2   | Log               2  | Log
3   | Hat               3  | Hat
3   | Hat               3  | Hat

У меня есть следующий код, чтобы сказать мне, есть ли «Hat» в группе, но каков наилучший способ установить каждое значение в этой группе на шляпу?

for i, x in df.groupby('ind'):
     if(x['val'].str.contains('Hat').any()):   

Ответы [ 4 ]

0 голосов
/ 10 мая 2018

Один из способов без groupby или lambda - использовать pd.DataFrame.loc:

import pandas as pd

df = pd.DataFrame({'ind': [1, 1, 1, 2, 2, 3, 3],
                   'val': ['Hat', 'Cat', 'Cat', 'Dog', 'Log', 'Hat', 'Hat']})

idx = set(df.loc[df['val'].str.contains('Hat', regex=False), 'ind'])

df.loc[df['ind'].isin(idx), 'val'] = 'Hat'

   ind  val
0    1  Hat
1    1  Hat
2    1  Hat
3    2  Dog
4    2  Log
5    3  Hat
6    3  Hat
0 голосов
/ 10 мая 2018

Просто

df.groupby("ind").transform(lambda k: "hat" if "hat" in k.values else k.values)
0 голосов
/ 10 мая 2018

Что я буду делать

df.loc[df.val.eq('Hat').groupby(df.ind).transform('any'),'val']='Hat'
df
   ind  val
0    1  Hat
1    1  Hat
2    1  Hat
3    2  Dog
4    2  Log
5    3  Hat
6    3  Hat 
0 голосов
/ 10 мая 2018
In [101]: (df.groupby('ind')['val']
             .transform(lambda x: ['Hat'] * len(x) if x.str.contains('Hat').any() else x))
Out[101]:
0    Hat
1    Hat
2    Hat
3    Dog
4    Log
5    Hat
6    Hat
Name: val, dtype: object
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...