Применяйте разные функции к разным столбцам с помощью команды singe pandas groupby - PullRequest
0 голосов
/ 10 октября 2019

Мои данные хранятся в df. У меня есть несколько users за group. Я хочу сгруппировать df по group и применить разные функции к разным столбцам. Суть в том, что я хотел бы назначить пользовательские имена новым столбцам во время этого процесса.

np.random.seed(123)
df = pd.DataFrame({"user":range(4),"group":[1,1,2,2],"crop":["2018-01-01","2018-01-01","2018-03-01","2018-03-01"],
                   "score":np.random.randint(400,1000,4)})
df["crop"] = pd.to_datetime(df["crop"])
print(df)
   user  group        crop  score
0     0      1  2018-01-01    910
1     1      1  2018-01-01    765
2     2      2  2018-03-01    782
3     3      2  2018-03-01    722

Я хочу получить среднее значение score, а минимальное и максимальное значения crop сгруппированыс помощью group и присваивайте пользовательские имена каждому новому столбцу. Желаемый результат должен выглядеть следующим образом:

  group  mean_score    min_crop    max_crop
0     1       837.5  2018-01-01  2018-01-01
1     2       752.0  2018-03-01  2018-03-01

Я не знаю, как это сделать в однострочном Python. В R я использовал бы data.table и получил бы следующее:

df[, list(mean_score = mean(score),
          max_crop   = max(crop),
          min_crop   = min(crop)), by = group]

Я знаю, что мог бы сгруппировать данные и использовать .agg в сочетании со словарем. Есть ли альтернативный способ, которым я могу присвоить каждому столбцу имя в этом процессе?

1 Ответ

1 голос
/ 10 октября 2019

Попробуйте создать функцию с необходимыми операциями, используя groupby().apply():

def f(x):
    d = {}
    d['mean_score'] = x['score'].mean()
    d['min_crop'] = x['crop'].min()
    d['max_crop'] = x['crop'].max()
    return pd.Series(d, index=['mean_score', 'min_crop', 'max_crop'])

data = df.groupby('group').apply(f)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...