[英]Most efficient way to combine large Pandas DataFrames based on multiple column values
[英]Pandas: efficient way to combine dataframes
我正在尋找一種比pd.concat更有效的方法來組合兩個熊貓DataFrame。
我有一個大型DataFrame(大小約為7GB),其中包含以下各列-“ A”,“ B”,“ C”,“ D”。 我想按“ A”對幀進行分組,然后對每個組:“ B”進行分組,對“ C”求平均值,對“ D”求和,然后將所有結果組合到一個數據幀中。 我嘗試了以下方法-
1)創建一個空的最終DataFrame,迭代“ A”的groupby進行我需要的處理,然后pd.concat每個組最終的DataFrame。 問題是pd.concat非常慢。
2)遍歷“ A”的groupby,進行所需的處理,然后將結果保存到csv文件中。 可以,但是我想找出是否有一種更有效的方法,該方法不涉及寫入磁盤的所有I / O。
代碼示例
第一種方法-帶有pd.concat的最終DataFrame:
def pivot_frame(in_df_path):
in_df = pd.read_csv(in_df_path, delimiter=DELIMITER)
res_cols = in_df.columns.tolist()
res = pd.DataFrame(columns=res_cols)
g = in_df.groupby(by=["A"])
for title, group in g:
temp = group.groupby(by=["B"]).agg({"C": np.mean, "D": np.sum})
temp = temp.reset_index()
temp.insert(0, "A", title)
res = pd.concat([res, temp], ignore_index=True)
temp.to_csv(f, mode='a', header=False, sep=DELIMITER)
return res
第二種方法-寫入磁盤:
def pivot_frame(in_df_path, ouput_path):
in_df = pd.read_csv(in_df_path, delimiter=DELIMITER)
with open(ouput_path, 'w') as f:
csv_writer = csv.writer(f, delimiter=DELIMITER)
csv_writer.writerow(["A", "B", "C", "D"])
g = in_df.groupby(by=["A"])
for title, group in g:
temp = group.groupby(by=["B"]).agg({"C": np.mean, "D": np.sum})
temp = temp.reset_index()
temp.insert(0, JOB_TITLE_COL, title)
temp.to_csv(f, mode='a', header=False, sep=DELIMITER)
第二種方法的工作方式比第一種方法快,但是我正在尋找一種可以使我一直無時無刻訪問磁盤的東西。 我閱讀了有關split-apply-combine的信息(例如-https: //pandas.pydata.org/pandas-docs/stable/user_guide/groupby.html ),但我發現它沒有幫助。
非常感謝! :)
解決了
因此Niels Henkens評論確實有幫助,解決方案是-
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()
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.