熊猫:将庞大的数据帧与较小的数据帧进行比较

时间:2018-04-30 04:24:44

标签: pandas dataframe large-data

我想在熊猫中比较两个数据帧,一个太大而不适合内存,另一个更小,适合内存。

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和set chunksize,但只修改文件本身,而不是将其与另一个文件进行比较。

额外的复杂性是我希望输出文件只保留与两个列匹配的行 - cat1和cat2。在上面的示例中,输出只是一行 - foo cat,因为这是两列匹配的唯一行。如果无法匹配两列,我不介意只能在一列上匹配的解决方案,我只需要修改数据帧以将cat1 / cat2组合成一列。

dfOutput:
cat1    cat2    cat3
foo     tiger   blue

1 个答案:

答案 0 :(得分:1)

使用read_table with chunksize,假设您首先创建一个将块与较小的表合并的函数:

==

请注意,合并时,pandas会在公共列上添加后缀。上面的代码表示不会在块的列中添加后缀(即元组中的dfSmall = pd.read_table(small_path, ...) def merge_it(c): return dfSmall.merge(c, on=['cat1', 'cat2'], suffixes=('', '_y'))[['cat1', 'cat2', 'cat3']] ),并且可以使用列''

然后你可以连接较大的块的合并,如下所示:

'cat1', 'cat2', 'cat3'

请注意,对于每个块,您可以将其与小型DataFrame合并。要获得完整的结果,您需要连接结果。