Группировать и интерполировать в Pandas - PullRequest
0 голосов
/ 20 декабря 2018

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

Данные выглядят так:

    Account Id  year week         views stats foo_col 
31133   213     2017-03-05          4.0     2.0     11.0
10085   456     2017-03-12          1.0     6.0     3.0
49551   789     2017-03-26          1.0     6.0     27.0

Вот мой код:

def interpolator(mini_df):
    mini_df = mini_df[cols_to_interpolate].set_index('year week')
    return mini_df.resample('D').ffill().interpolate() / 7

example = list(grp)[0][1]
interpolator(example) # This works perfectly

df.groupby('Account Id').agg(interpolator)                # doesn't work
df.groupby('Account Id').transform(interpolator)          # doesn't work

for name,group in grp:
    group = group[cols_to_interpolate].set_index('year week')
    group = group.resample('D').ffill().interpolate() / 7 # doesn't work

for acc_id in df['Account Id'].unique():
    mask = df.loc[df['Account Id'] == acc_id]
    print(df[mask])                                     # doesn't work

1 Ответ

0 голосов
/ 20 декабря 2018

Я надеюсь, что ваша функция должна быть связана с groupby объектом вроде:

df = (df.set_index('year week')
        .groupby('Account Id')[cols_to_interpolate]
        .resample('D')
        .ffill()
        .interpolate() / 7)

Решение из комментариев отличается - interpolate применимо для каждой группы:

df.groupby('Account Id').apply(interpolator)
...