【问题标题】:Groupby and combine a dataframe using VaexGroupby 并使用 Vaex 组合数据框
【发布时间】:2019-11-08 01:57:45
【问题描述】:

我有一个大的 .csv 文件,大约有 150M 行。我仍然可以将整个数据集放入内存并使用 Pandas 进行分组和组合。示例...

aggregated_df = df.groupby(["business_partner", "contract_account"]).sum()

在上面的示例中,数据框包含两个整数列,business_partnercontract_account,它们用作分组操作的键。可以假设剩余的列都是我想要聚合的浮点特征。

但是,这仅使用了我工作站上 48 个内核中的 1 个。我正在尝试使用vaex 来利用我所有的内核,但无法弄清楚执行 groupby 和 combine 的 API 调用。也许在 Vaex 中还不可能?

编辑:

  1. 我知道此操作可以在 dask 中完成,但对于这个问题,我想重点关注 Vaex。

【问题讨论】:

  • 你的数据是什么样的?
  • @davidrpugh 您是否愿意使用 dask 进行此操作。它具有与 pandas 相同的 api(建立在 pandas 之上)。 from dask.distributed import Client; client = Client(n_workers=1, threads_per_worker=4, processes=False, memory_limit='2GB') ;df.goupby(["col1", "col2"]).sum().compute()

标签: python pandas vaex


【解决方案1】:

您可以在https://docs.vaex.io/en/latest/api.html#vaex.dataframe.DataFrameLocal.groupby 中找到一个工作示例

以您按 2 列分组并获得总和聚合的示例为例:

import pandas as pd, numpy as np
import vaex

# Create input dataframe

n=10**6  # Change this to adjust df size

a_c1 = [1,2,3]*n
a_c2 = [1,1,2,2,3,3]*int(n/2)
a_x = np.arange(float(len(a_c1)))
df = pd.DataFrame({'c1':a_c1,'c2':a_c2,'x1':a_x, 'x2':a_x})

# Convert dataframe to vaex

# dfv = vaex.from_pandas(df) # This also works, but it's slower
dfv = vaex.from_arrays(c1=a_c1, c2=a_c2, x1=a_x, x2=a_x)

df_result1 = df.groupby(['c1','c2']).sum()
df_result2 = dfv.groupby(['c1','c2'],agg='sum')

输出结构会略有不同:

> print(df_result1)

                 x1            x2
c1 c2                            
1  1   7.499985e+11  7.499985e+11
   2   7.500000e+11  7.500000e+11
2  1   7.499990e+11  7.499990e+11
   3   7.500005e+11  7.500005e+11
3  2   7.499995e+11  7.499995e+11
   3   7.500010e+11  7.500010e+11

> print(df_result2)

  #    c1    c2      x_1_sum      x_2_sum
  0     2     3  7.50000e+11  7.50000e+11
  1     2     1  7.49999e+11  7.49999e+11
  2     3     2  7.5e+11      7.5e+11
  3     3     3  7.50001e+11  7.50001e+11
  4     1     2  7.5e+11      7.5e+11
  5     1     1  7.49998e+11  7.49998e+11

【讨论】:

    【解决方案2】:

    据我所知,您必须手动调整分组的限制和箱数 - 但 'binby' 参数应该在 vaex 中完成这项工作:

    df.sum([list of columns you want summed],binby=["business_partner", "contract_account"],limits=['minmax','minmax'],
           shape=[business_partner_bins,contract_account_bins])
    

    如果您想要对所有列求和,您可以将 [您想要求和的列列表] 替换为 df.column_names

    PS。我刚刚注意到 vaex 中有一个 groupby 功能,但我没有使用它的经验。 https://vaex.readthedocs.io/en/latest/api.html?highlight=groupby#vaex.dataframe.DataFrameLocal.groupby

    【讨论】:

    • 我会试一试(文档中有一个类似的例子),但这种方法来自 SQL 和 Pandas 似乎很奇怪。特别是我不明白需要提供shapebinby 列将数据分组到箱中,然后对于每个箱,我想计算总和。从文档看来,这种方法似乎适用于不同的用例。我还找到了您提到的 groupby 函数,但始终无法正常工作。
    • 是的,我认为你是正确的,这不是这种方法的预期用途 - 所以这就是你必须调整形状的原因。 binby 确实将列分组到 bin 中,shape 设置 bin 的数量。如果我没记错的话,默认的shape 是 64。我在这里假设您希望每个“business_partner”和“contract_account”都有一个 bin,这可能不是 64,所以我建议更改默认形状。
    猜你喜欢
    • 2017-12-18
    • 2022-01-14
    • 1970-01-01
    • 2021-01-22
    • 2021-09-23
    • 2018-04-17
    • 1970-01-01
    • 1970-01-01
    • 2014-09-05
    相关资源
    最近更新 更多