Реализовать разные функции для разных объектов groupby pandas - PullRequest
1 голос
/ 05 августа 2020

Проведя небольшое исследование, я обнаружил следующее ( Применение разных функций к разным элементам в объекте группы: Python pandas). Возможно, это то же самое, что я хочу, но я не могу понять предлагаемые ответы. Позвольте мне попытаться объяснить на простом примере, что я хочу:

import pandas as pd
import numpy as np

df = pd.DataFrame({'B': ['one', 'one', 'two', 'three',
                         'two', 'two', 'one', 'three'],
                   'C': np.random.randn(8),
                   'D': np.random.randn(8)})
grouped = df.groupby(['B'])

Допустим, у нас есть простой набор данных, созданный из приведенного выше, который выглядит следующим образом:

       B         C         D
0    one -1.758565 -1.544788
1    one -0.309472  2.289912
2    two -1.885911  0.384215
3  three  0.444186  0.551217
4    two -0.502636  2.125921
5    two -2.247551 -0.188705
6    one -0.575756  1.473056
7  three  0.640316 -0.410318

После сгруппировав их в столбце «B», было создано 3 группы

  1. одна
  2. две
  3. три

Теперь, как можно Я применяю к этим группам разные функции, но все же использую их как часть одного фрейма данных. Например, если бы я хотел проверить, были ли элементы <0,5 в группе 1, делимые на 2 в группе 2 и -ve в группе 3. Эти функции предназначены только для иллюстративных целей, я хочу подчеркнуть, что они должны быть разными. пользовательские функции, которые должны применяться к каждой группе, но результат должен быть чем-то, что мы можем увидеть в одном фрейме данных. Приветствуются любые советы. </p>

1 Ответ

3 голосов
/ 05 августа 2020

Вы можете использовать np.where для определения любого logi c, который вы хотите:

df['Flag'] = np.where((df['B'] == 'one') & (df['C'] < 0.5), True, False)
df['Flag'] = np.where((df['B'] == 'two') & (df['C'] >= 0.5), True, df['Flag'])
df['Flag'] = np.where((df['B'] == 'three') & (df['C'] < 0.5), True, df['Flag'])

Out[85]: 
       B         C         D   Flag
0    one -1.758565 -1.544788   True
1    one -0.309472  2.289912   True
2    two -1.885911  0.384215  False
3  three  0.444186  0.551217   True
4    two -0.502636  2.125921  False
5    two -2.247551 -0.188705  False
6    one -0.575756  1.473056   True
7  three  0.640316 -0.410318  False

Оттуда, допустим, вы хотите сгруппировать по итоговым значениям True:

df = df.groupby('B')['Flag'].sum().reset_index()

       B    Flag
0    one     3.0
1  three     1.0
2    two     0.0

Чтобы реализовать как настраиваемую пользовательскую функцию (для каждого комментария), вы можете:

def flag(one, two, three):
    df['Flag'] = np.where((df['B'] == 'one') & (one), True, False)
    df['Flag'] = np.where((df['B'] == 'two') & (two), True, df['Flag'])
    df['Flag'] = np.where((df['B'] == 'three') & (three), True, df['Flag'])


flag(one=df['C'] < 0.5, two=df['C'] >= 0.5, three=df['C'] < 0.5)
df

B         C         D   Flag
0    one -1.758565 -1.544788   True
1    one -0.309472  2.289912   True
2    two -1.885911  0.384215  False
3  three  0.444186  0.551217   True
4    two -0.502636  2.125921  False
5    two -2.247551 -0.188705  False
6    one -0.575756  1.473056   True
7  three  0.640316 -0.410318  False
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...