Агрегировать столбцы в Dataframe, группируя их по другому dataframe, не объединяя их - PullRequest
1 голос
/ 10 апреля 2019

У меня есть два кадра данных df1 и df2:

  • У df1 есть column1, column2 и много строк (~ 10 миллионов)
  • У df2 есть column2, много других столбцов, и он короткий (~ 100 столбцов и ~ 1000 строк)

Чего я хочу добиться:

df1.merge(df2, on=column2).groupby(column1).agg($SomeAggregatingFunction)

Но избегайте операции слияния, поскольку она будет занимать много памяти.

Есть ли способ получить такое поведение?

1 Ответ

2 голосов
/ 10 апреля 2019

Если только затраты памяти не станут узким местом, я ожидаю, что такой подход может быть медленнее.Тем не менее, вы пытались установить подмножество df2 на основе индексов column2, которые возвращаются после операции groupby на df1?Ниже приведен пример того, что я имею в виду.

Полагаю, что другим вариантом было бы рассмотреть структуру сокращения карты (например, pyspark)?

# two toy datasets
df1 = pd.DataFrame({i:np.random.choice(np.arange(10), size=20) for i in range(2)}).rename(columns={0:'col1',1:'col2'})
df2 = pd.DataFrame({i:np.random.choice(np.arange(10), size=5) for i in range(2)}).rename(columns={0:'colOther',1:'col2'})

# make sure we don't use values of col2 that df2 doesn't contain
df1 = df1[df1['col2'].isin(df2['col2'])]

# for faster indexing and use of .loc
df2_col2_idx = df2.set_index('col2')

# iterate over the groups rather than merge
for i,group in df1.groupby('col1'):
    subset = df2_col2_idx.loc[group.col2,:]

    # some function on the subset here
    # note 'i' is the col1 index
    print(i,subset.colOther.mean())

Обновление: для включения предложения комментария @ max для apply функции для групп:

df1.groupby(column1).apply(lambda x: df2_col2_idx.loc[x[columns2],other_columns].agg($SomeAggregatingFunction))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...