панды групповой; условие if: sum else: max для данного столбца на основе другого столбца - PullRequest
0 голосов
/ 10 ноября 2018

Скажи за df Я делаю групповое на group:

df = pd.DataFrame(np.random.rand(4,4), columns=list('abcd'))
df['group'] = [0, 0, 1, 1]

, затем я хочу свернуть df так, чтобы A суммировалось, если сумма B больше 1, и я хочумаксимум A, если сумма B меньше или равна 1.

Тогда я хочу min () для B и другие различные операции над оставшимися столбцами.

Ответы [ 2 ]

0 голосов
/ 13 ноября 2018

Для лучшей производительности используйте where:

np.random.seed(15)
N = 1000
df = pd.DataFrame(np.random.rand(N,10), columns=list('abcdefghij'))
df['group'] = np.random.randint(100, size=N)

df_grouped = df.groupby('group')
s1 = df_grouped.apply(lambda grp: grp['a'].sum() if grp['b'].sum() > 1 else grp['a'].max())
print (s1)

df_grouped = df.groupby('group')
s2 = df_grouped['a'].sum().where(df_grouped['b'].sum() > 1, df_grouped['a'].max())
print (s2)


In [69]: %%timeit
    ...: df_grouped = df.groupby('group')
    ...: s1 = df_grouped.apply(lambda grp: grp['a'].sum() if grp['b'].sum() > 1 else grp['a'].max())
    ...: 
24.8 ms ± 228 µs per loop (mean ± std. dev. of 7 runs, 10 loops each)

In [70]: %%timeit
    ...: df_grouped = df.groupby('group')
    ...: s2 = df_grouped['a'].sum().where(df_grouped['b'].sum() > 1, df_grouped['a'].max())
    ...: 
1.63 ms ± 58 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)
0 голосов
/ 10 ноября 2018

Я понял это с apply:

df_grouped = df.groupby('group')
df_grouped.apply(lambda grp: grp['a'].sum() if grp['b'].sum() > 1 else grp['a'].max())

group
0    0.834666
1    1.096652
dtype: float64
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...