Как заставить Pandas подать заявку на возврат всех столбцов родительского фрейма данных? - PullRequest
0 голосов
/ 26 апреля 2019

После использования groupby в определенных столбцах фрейма данных и последующего использования команды apply, чтобы проверить, существует ли строка в другом столбце, pandas возвращает только те столбцы, по которым был сгруппирован, и последний столбец, созданный с применением. Можно ли вернуть все столбцы, связанные с groupby, и проверить? Например, группировка по уникальным идентификаторам для цепочки разговоров и проверка, существует ли строка в другом столбце, но затем включить некоторые другие столбцы, которые существуют в кадре данных, но принадлежат определенной группе?

Я пытался использовать groupby, а затем применить apply для анонимной функции.

df.head()

 shipment_id shipper_id courier_id  Question                                sender
0   14      9962    228898  Let's get your furbabys home Apple pet transpo...   courier
1   91919   190872  196838  Hi I'm kevin thims and I'm happy to do the job...   courier
2   92187   191128  196838  Hi I'm kevin thims and I'm happy to do the job...   shipper

unique_thread_indentifier = ['shipment_id', 'shipper_id', 'courier_id']
required_variables = ['shipment_id', 'shipper_id', 'courier_id', 'Question', 'sender']

df_new = (
    df
    .groupby(unique_thread_indentifier)[required_variables]
    .apply(lambda group: 'shipper' in group['sender'].unique())
    .to_frame(name='shipper_replied')
    .reset_index()
)

df_new.head()
    shipment_id shipper_id  courier_id  shipper_replied
0   14      9962            228898          False
1   91919   190872          196838          False
2   92187   191128          196838          True

Я собираюсь включить столбцы Question и sender в окончательный фрейм данных. Ожидаемый результат будет выглядеть следующим образом:

 shipment_id shipper_id courier_id  Question                                sender        shipper_replied
0   14      9962    228898  Let's get your furbabys home Apple pet transpo...   courier       False
1   91919   190872  196838  Hi I'm kevin thims and I'm happy to do the job...   courier       False
2   92187   191128  196838  Hi I'm kevin thims and I'm happy to do the job...   shipper       True

1 Ответ

1 голос
/ 26 апреля 2019

Я считаю, что вам нужно GroupBy.transform:

df['shipper_replied'] = (df.groupby(unique_thread_indentifier)['sender']
                           .transform(lambda group: 'shipper' in group.unique()))

print (df)
   shipment_id  shipper_id  courier_id  \
0           14        9962      228898   
1        91919      190872      196838   
2        92187      191128      196838   

                                          Question   sender  shipper_replied  
0  Let's get your furbabys home Apple pet transpo.  courier            False  
1   Hi I'm kevin thims and I'm happy to do the job  courier            False  
2   Hi I'm kevin thims and I'm happy to do the job  shipper             True  

Другое решение:

df['shipper_replied'] = (df.assign(new = df['sender'].eq('shipper'))
                           .groupby(unique_thread_indentifier)['new']
                           .transform('any'))

print (df)
   shipment_id  shipper_id  courier_id  \
0           14        9962      228898   
1        91919      190872      196838   
2        92187      191128      196838   

                                          Question   sender  shipper_replied  
0  Let's get your furbabys home Apple pet transpo.  courier            False  
1   Hi I'm kevin thims and I'm happy to do the job  courier            False  
2   Hi I'm kevin thims and I'm happy to do the job  shipper             True  
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...