如何在没有副本的情况下将小型数据框合并为大型数据框
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()
)
我有一个很大的 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()
)