Генерация кадра данных из объекта pandas groupby с функцией apply, возвращающей несколько значений - PullRequest
0 голосов
/ 09 октября 2019

Пример ввода:

df = pd.DataFrame(data = [[0,1,2,3], [0,1,3,4], [0,2,5,6], [0,2,7,8]], columns=['id1', 'id2', 'var1', 'var2'])

df

функция f:

def f(var1, var2):
    return [np.sum(var1)*10, np.sum(var2)*10]

необходим выход:

result_df

Метод, который я использовал для создания этого:

result_df = pd.DataFrame(df.groupby(['id1', 'id2'])['var1', 'var2'].apply(lambda x: f(x['var1'], x['var2'])))
pd.DataFrame(result_df[0].tolist(), columns=['result_var1', 'result_var2'], index=result_df.index).reset_index()

Есть ли какой-либо лучший метод для создания кадра данных путем применения функции кобъект pandas groupby, и функция возвращает несколько значений.

Ответы [ 3 ]

3 голосов
/ 09 октября 2019

Использование agg :

result = df.groupby(['id1', 'id2'], as_index=False).agg(lambda x: x.sum() * 10)
print(result)

Выход

   id1  id2  var1  var2
0    0    1    50    70
1    0    2   120   140

Более общее применение agg следующее:

def general_var1(x):
    return x.sum() * 10


def general_var2(x):
    return x.sum() * 5 + 2


result = df.groupby(['id1', 'id2'], as_index=False).agg({'var1': general_var1, 'var2': general_var2})

Вывод

   id1  id2  var1  var2
0    0    1    50    37
1    0    2   120    72

Дополнительные примеры можно найти в связанной документации.

0 голосов
/ 09 октября 2019

Если вам нужно именно то, что у вас есть (даже с измененными именами столбцов), используйте код ниже.

(df.groupby(['id1', 'id2'])['var1', 'var2'].sum()*10).add_prefix('result_').reset_index()

Выход

   id1  id2     result_var1     result_var2
0   0   1             50        70
1   0   2             120       140
0 голосов
/ 09 октября 2019

попробуйте

(df.groupby(['id1', 'id2']).sum() * 10).reset_index()

Out[247]:
   id1  id2  var1  var2
0    0    1    50    70
1    0    2   120   140
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...