如何在没有副本的情况下将小型数据框合并为大型数据框

how to merge small dataframes into a large without copy

我有一个很大的 pandas 数据框,我想将几​​个较小的数据框合并到其中,从而添加更多的列。但是,似乎每次合并后都隐含了大数据帧的副本,我想避免这种情况。最有效的方法是什么? (请注意,生成的数据框将具有相同的行,因为它随着列的增加而增长。)map 似乎更好,因为它保留了原始数据框,但是创建字典会产生开销。也不确定它是否适用于将多个列合并到主要列中。或者 merge 可能没有在内部深度复制所有内容?

基本案例:

id(df)  # before merge

df = df.merge(df1[["sid", "col1"]], how="left", on=["sid"])
id(df)  # will be different  <-- trying to avoid copying df every time a smaller one merged into it

df = df.merge(df2[["sid", "col2"]], how="left", on=["sid", "key2"])
id(df)  # will be different   
...

使用地图():

d_col1 = {d["sid"]:d["col1"] for d in df1[["sid", "col1"]].to_dict("records")}
df["col1"] = df["sid"].map(d_col1)
id(df) # this is the same object

一些 post 提到了 dask,还没有测试过。

这是另一种方法。首先 map 可以用 Series 完成,因为 df1 已经构建,我不知道它是否比使用字典效率低。

df["col1"] = df["sid"].map(df1.set_index('sid')['col1']) 

现在有两列或更多列,您可以使用索引

df['col2'] = (
    df2.set_index(['sid','key2'])['col2']
       .reindex(pd.MultiIndex.from_frame(df[['sid','key2']]))
       .to_numpy()
)