高效地完成Python Pandas列的组合



我有一个Pandas数据帧df,每列只能为True/False。

我想遍历2列的所有可能组合,并基本上执行以下操作:

import pandas as pd
import time
import os
import random
import itertools 
# Test dataframe
input_list = [True,False,True]
df = pd.DataFrame({'col0':input_list},index=[1,2,3])
for i in range(1,100):
random.shuffle(input_list)
df['col{}'.format(i)]=input_list
def test_func(df):
return df
# Iteration starts here
start_time = time.time()
for col1, col2 in itertools.combinations(df.columns, 2):
output = df.loc[(df[col1]==True) & (df[col2]==True)]
ret = test_func(output)
print(time.time()-start_time)

我想知道当列组合的数量很大时,最有效的方法是什么。目前,我使用itertools.combinationsfor循环来完成这项工作,如上所示。我能想到的可能的改进是将上面的代码封装在一个函数中,并调用多进程。带地图的游泳池。

def incasulate_fun(df,col1,col2):
output = df.loc[(df[col1]==True) & (df[col2]==True)]
return function(output)

df相对较小,可以放入内存。我的期望是,如果有一台4核机器,并且内存不是问题,我可以获得大约4倍的速度。感谢您的建议。

谢谢!

itertools.combinations/pd.concat

from itertools import combinations
pd.concat({(a, b): df[a] & df[b] for a, b in combinations(df.columns, 2)}, axis=1)
A             B
B      C      C
0  False   True  False
1  False  False  False
2   True  False  False

设置

df = pd.DataFrame([[1, 0, 1], [0, 1, 0], [1, 1, 0]], range(3), [*'ABC'], dtype=bool)
df
A      B      C
0   True  False   True
1  False   True  False
2   True   True  False

最新更新