我想在熊猫中比较两个数据帧,一个太大而不适合内存,另一个更小,适合内存。
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
答案 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合并。要获得完整的结果,您需要连接结果。