Python 熊猫:组合数据帧的有效方法

Python 熊猫:组合数据帧的有效方法,python,pandas,performance,split-apply-combine,Python,Pandas,Performance,Split Apply Combine,我正在寻找一种比pd.concat更有效的方法来组合两个数据帧 我有一个大数据帧(大小约7GB),包含以下列——“a”、“B”、“C”、“D”。我想按“A”按帧分组,然后针对每个组: 按“B”分组,平均“C”和“D”之和,然后将所有结果合并到一个数据帧中。我尝试过以下方法- 1) 创建一个空的最终数据帧,迭代“A”的groupby进行我需要的处理,然后pd.concat将每个组作为最终数据帧。问题是pd.concat的速度非常慢 2) 迭代“A”的groupby,进行所需的处理,然后将结果保存到

我正在寻找一种比pd.concat更有效的方法来组合两个数据帧

我有一个大数据帧(大小约7GB),包含以下列——“a”、“B”、“C”、“D”。我想按“A”按帧分组,然后针对每个组: 按“B”分组,平均“C”和“D”之和,然后将所有结果合并到一个数据帧中。我尝试过以下方法-

1) 创建一个空的最终数据帧,迭代“A”的groupby进行我需要的处理,然后pd.concat将每个组作为最终数据帧。问题是pd.concat的速度非常慢

2) 迭代“A”的groupby,进行所需的处理,然后将结果保存到csv文件中。这是正常的,但我想知道是否有一种更有效的方法,不涉及写入磁盘的所有I/O

代码示例

第一种方法-带有pd.concat的最终数据帧:

def pivot_帧(在_-df_路径中):
in_df=pd.read_csv(in_df_path,delimiter=delimiter)
res_cols=in_df.columns.tolist()
res=pd.DataFrame(列=res\u cols)
g=在[u df.groupby(by=[“A”])
对于标题,g中的组:
temp=group.groupby(by=[“B”]).agg({“C”:np.mean,“D”:np.sum})
温度=温度重置指数()
临时插入(0,“A”,标题)
res=pd.concat([res,temp],忽略索引=True)
临时至csv(f,mode='a',header=False,sep=DELIMITER)
返回res
第二种方法-写入磁盘:

def pivot\u帧(在df\u路径、输出路径中):
in_df=pd.read_csv(in_df_path,delimiter=delimiter)
打开(输出路径“w”)作为f:
csv_writer=csv.writer(f,delimiter=delimiter)
csv_writer.writerow([“A”、“B”、“C”、“D”])
g=在[u df.groupby(by=[“A”])
对于标题,g中的组:
temp=group.groupby(by=[“B”]).agg({“C”:np.mean,“D”:np.sum})
温度=温度重置指数()
临时插入(0,工作标题,标题)
临时至csv(f,mode='a',header=False,sep=DELIMITER)
第二种方法比第一种方法快得多,但我正在寻找一种可以让我一直不用访问磁盘的方法。我读过关于split-apply联合收割机(例如-)的文章,但我觉得没有帮助


非常感谢!:)

已解决

因此,尼尔斯·亨肯的评论真的很有帮助,解决办法是—

result = in_df.groupby(by=["A","B"]).agg({"C": np.mean, "D": np.sum})
性能的另一个改进是使用Dask-

import dask.dataframe as dd
df = dd.read_csv(PATH_TO_FILE, delimiter=DELIMITER)
g = df.groupby(by=["A", "B"]).agg({"C": np.mean, "D": np.sum}).compute().reset_index()

为什么不使用多索引groupby,这样您就可以一次按“a”和“B”分组,而不是遍历“a”组?这也将节省连接工作。你有一些样本数据吗?很遗憾,我不能提供样本数据。你能详细说明格劳比多重指数吗?你有没有消费达斯克?