我有一个大型.csv
文件,大约有1.5亿行。我仍然可以将整个数据集放入内存中,并使用Pandas进行分组和合并。例子...
aggregated_df = df.groupby(["business_partner", "contract_account"]).sum()
在上面的示例中,数据帧包含两个整数列business_partner
和contract_account
,它们用作分组操作的键。其余的列可以假定都是我想聚合的浮点要素。
但是,这仅使用工作站上48个内核中的1个。我试图使用vaex来利用我所有的内核,但是无法弄清楚API调用来执行分组和合并。也许Vaex还不可能?
修改:
答案 0 :(得分:0)
据我所知,您将不得不手动调整分组的限制和箱数-但是'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
答案 1 :(得分:0)
您可以在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