python - 如何并行合并两个 Pandas 数据框(多线程或多处理)

标签 python multithreading pandas parallel-processing multiprocessing

在不进行并行编程的情况下,我可以使用下面的代码在 key 列上合并左右数据帧,但它会太慢,因为它们都非常大。有什么方法可以有效地并行化吗?

我有 64 个内核,所以实际上我可以使用其中的 63 个来合并这两个数据帧。

left = pd.DataFrame({'key': ['K0', 'K1', 'K2', 'K3'],
                      'A': ['A0', 'A1', 'A2', 'A3'],
                     'B': ['B0', 'B1', 'B2', 'B3']})


right = pd.DataFrame({'key': ['K0', 'K1', 'K2', 'K3'],
                      'C': ['C0', 'C1', 'C2', 'C3'],
                      'D': ['D0', 'D1', 'D2', 'D3']})


result = pd.merge(left, right, on='key')

输出将是:

left:
    A   B key
0  A0  B0  K0
1  A1  B1  K1
2  A2  B2  K2
3  A3  B3  K3

right:
    C   D key
0  C0  D0  K0
1  C1  D1  K1
2  C2  D2  K2
3  C3  D3  K3

result:
    A   B key   C   D
0  A0  B0  K0  C0  D0
1  A1  B1  K1  C1  D1
2  A2  B2  K2  C2  D2
3  A3  B3  K3  C3  D3

我想并行执行此操作,以便快速完成。

最佳答案

我相信你可以使用 dask . 和功能merge .

Docs说:

什么绝对有效?

Cleverly parallelizable operations (also fast):

Join on index: dd.merge(df1, df2, left_index=True, right_index=True)

或者:

Operations requiring a shuffle (slow-ish, unless on index)

Set index: df.set_index(df.x)

Join not on the index: pd.merge(df1, df2, on='name')

您还可以检查如何 Create Dask DataFrames .

示例

import pandas as pd

left = pd.DataFrame({'key': ['K0', 'K1', 'K2', 'K3'],
                      'A': ['A0', 'A1', 'A2', 'A3'],
                     'B': ['B0', 'B1', 'B2', 'B3']})


right = pd.DataFrame({'key': ['K0', 'K1', 'K2', 'K3'],
                      'C': ['C0', 'C1', 'C2', 'C3'],
                      'D': ['D0', 'D1', 'D2', 'D3']})


result = pd.merge(left, right, on='key')
print result
    A   B key   C   D
0  A0  B0  K0  C0  D0
1  A1  B1  K1  C1  D1
2  A2  B2  K2  C2  D2
3  A3  B3  K3  C3  D3

import dask.dataframe as dd

#Construct a dask objects from a pandas objects
left1 = dd.from_pandas(left, npartitions=3)
right1 = dd.from_pandas(right, npartitions=3)

#merge on key
print dd.merge(left1, right1, on='key').compute()
    A   B key   C   D
0  A3  B3  K3  C3  D3
1  A1  B1  K1  C1  D1
0  A2  B2  K2  C2  D2
1  A0  B0  K0  C0  D0
#first set indexes and then merge by them
print dd.merge(left1.set_index('key').compute(), 
               right1.set_index('key').compute(), 
               left_index=True, 
               right_index=True)
      A   B   C   D
key                
K0   A0  B0  C0  D0
K1   A1  B1  C1  D1
K2   A2  B2  C2  D2
K3   A3  B3  C3  D3

关于python - 如何并行合并两个 Pandas 数据框(多线程或多处理),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35785109/

相关文章:

Python3 Selenium ChromeDriver 禁用扩展仅记录 Pyinstaller Windows 10

python - 如何让 PyC​​ollada 向同一场景输出多个网格?

python - 根据上一个和下一个值过滤 pandas 数据框

python - 线程化的 Django 任务不会自动处理事务或数据库连接?

javascript - 使用 javascript 在 2 个 google chrome 进程(选项卡)之间进行通信

python - 使用 Pandas 读取csv中的特定单元格

Python,Pandas删除指定列中具有特定值的行

python - 如何在 bottle 中使用 jinja2 i18n(带 babel)

python - 如何对具有重复列名的行进行切片并按顺序堆叠这些行

c# - 使用 Xamarin 显示 Android ProgressBar