我有一个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.combinations
和for
循环来完成这项工作,如上所示。我能想到的可能的改进是将上面的代码封装在一个函数中,并调用多进程。带地图的游泳池。
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