簡體   English   中英

熊貓:組合數據框的有效方法

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM