Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/304.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 将所有列的组合相乘_Python_Python 3.x_Pandas_Numpy - Fatal编程技术网

Python 将所有列的组合相乘

Python 将所有列的组合相乘,python,python-3.x,pandas,numpy,Python,Python 3.x,Pandas,Numpy,我正试图找到一种有效的方法,在一个数据帧内将每个列组合相乘。我用itertools成功地实现了这一点,但是当数据帧的大小增加时,它的速度会显著减慢。我需要在大约1001000大小的数据帧上执行此操作 下面是具有较小数据帧的工作代码示例 import numpy as np import pandas as pd from itertools import combinations_with_replacement df = pd.DataFrame(np.random.randn(3, 10)

我正试图找到一种有效的方法,在一个数据帧内将每个列组合相乘。我用itertools成功地实现了这一点,但是当数据帧的大小增加时,它的速度会显著减慢。我需要在大约1001000大小的数据帧上执行此操作

下面是具有较小数据帧的工作代码示例

import numpy as np
import pandas as pd
from itertools import combinations_with_replacement

df = pd.DataFrame(np.random.randn(3, 10))
new_df = pd.DataFrame()

for p in combinations_with_replacement(df.columns,2):
        title = p
        new_df[title] = df[p[0]]*df[p[1]]  
有人对如何实现这一点有什么建议吗?

结合索引视图和array.prodaxis,运行速度快了约100倍:

def f1():
    #with loop
    new_df = pd.DataFrame()
    for p in combinations_with_replacement(df.columns,2):
            title = p
            new_df[title] = df[p[0]]*df[p[1]]
    return new_df

def f2():
    n = len(df.columns)
    ix = np.indices((n,n))[:, ~np.tri(n, k=-1, dtype=bool)]
    return pd.DataFrame(df.values.T[ix.T].prod(1).T, columns=list(map(tuple, ix.T)))

由于无法保存任何计算,我猜它的复杂性必须是^2。如果数据帧中的列值不仅仅是索引位置,那么如何设置新的列标题以显示相乘的结果。例如,如果df如下所示;df=pd.DataFramenp.random.randn3,10,columns=['a','b','c','d','e','f','g','h','j','k']我希望将'a','b'看作一列,而不是0,1使用columns=listmaptuple,np.array['a','b','c','d','e','f','g','h','j','k'][ix.T]。注意listmaptuple仅用于为列标题创建元组,而np.array…[ix.T]用于创建字母组合数组。