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 函数

Pandas 大数据帧比较

Python中使用pandas数据框和嵌套for循环的基于项目的协作过滤器的瓶颈

pandas vs pyexcelerate 写入excel大文件比较

Pandas中如何处理大数据?