Pandas:比较大数据框和小数据框
Posted
技术标签:
【中文标题】Pandas:比较大数据框和小数据框【英文标题】:Pandas: compare huge dataframe with smaller dataframe 【发布时间】:2018-10-10 03:52:18 【问题描述】:我有两个要在 pandas 中比较的数据框,一个太大而无法放入内存,另一个较小但确实适合内存。
dfSmall:
cat1 cat2
foo bar
foo tiger
foo spam
bar spam
(5000 rows)
dfLarge:
cat1 cat2 cat3
foo dog green
foo tiger blue
foo snake green
foo bird pink
bar dog orange
...
(>1 million rows)
我使用了 dask.dataframe (dd.merge),但它需要很长时间和大量的摆弄,而且它似乎效率低下,因为我的一个 df 将适合内存。我还使用了带有设置块大小的 pandas.read_table,但仅用于修改文件本身,而不是将其与另一个文件进行比较。
额外的复杂性是我希望输出文件只保留与 两个 列匹配的行 - cat1 和 cat2。在上面的示例中,输出将只是一行 - foo cat
,因为这是唯一两列都匹配的行。如果无法匹配两列,我不介意只能匹配一列的解决方案,我只需要修改数据框以将 cat1/cat2 合并为一列。
dfOutput:
cat1 cat2 cat3
foo tiger blue
【问题讨论】:
在上面的例子中,输出是foo tiger
(不是foo cat
),不是吗?
【参考方案1】:
使用read_table
with chunksize,假设您首先创建了一个将块与较小表合并的函数:
dfSmall = pd.read_table(small_path, ...)
def merge_it(c):
return dfSmall.merge(c, on=['cat1', 'cat2'], suffixes=('', '_y'))[['cat1', 'cat2', 'cat3']]
请注意,当您合并时,pandas 会在公共列上添加后缀。上面的代码说不要给块的列添加后缀(即元组中的''
),并取列'cat1', 'cat2', 'cat3'
。
然后您可以连接较大的块合并,如下所示:
pd.concat([merge_it(c) for c in pd.read_table(large_path, ..., chunksize=100000)])
请注意,对于每个块,您都会将它与小 DataFrame 合并。要获得完整的结果,您需要连接结果。
【讨论】:
我会试试这个!您能否详细说明为什么suffixes=
以及末尾括号中的类别(小数据集只有cat1/cat2
,这是否告诉合并将哪些列保存在大数据集中?为什么在合并中使用pd.concat @ 987654329@而不是合并,如何添加才能与大文件合并?谢谢!
@Liquidity 添加了解释。以上是关于Pandas:比较大数据框和小数据框的主要内容,如果未能解决你的问题,请参考以下文章
使用 Pandas 将数据框和其他数据保存在同一个 .csv 文件中
如何将函数应用于两列 Pandas 数据框和两列 if 函数
Python中使用pandas数据框和嵌套for循环的基于项目的协作过滤器的瓶颈