Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/315.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/339.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_Pandas_Dataframe_Python 3.6 - Fatal编程技术网

Python 为表中的所有列生成列矩阵

Python 为表中的所有列生成列矩阵,python,pandas,dataframe,python-3.6,Python,Pandas,Dataframe,Python 3.6,我有一个由6列组成的数据框。生成矩阵的最快方法是什么,该矩阵具有以下功能: 步骤1)col1*col1a、col2*col2a、col3*col3a、col4*col4a 步骤2)col_new=(col1*col1a)-col2*col2a)/(col1a-col2a) 使用for循环是一种选择——但有什么更快的方法可以实现这一点呢 import pandas as pd df=pd.DataFrame() df['col1']=[100,200,300,400,500] df['col1a'

我有一个由6列组成的数据框。生成矩阵的最快方法是什么,该矩阵具有以下功能:

步骤1)col1*col1a、col2*col2a、col3*col3a、col4*col4a

步骤2)col_new=(col1*col1a)-col2*col2a)/(col1a-col2a)

使用for循环是一种选择——但有什么更快的方法可以实现这一点呢

import pandas as pd
df=pd.DataFrame()
df['col1']=[100,200,300,400,500]
df['col1a']=[6,71,8,90,10]
df['col2']=[600,700,800,1900,100]
df['col2a']=[6,17,8,9,10]
df['col3']=[100,220,300,440,500]
df['col3a']=[1,22,3,44,5]

df[1x2]=(df['col1']*df['col1a']-df['col2']*df['col2a'])/(df['col1a']-df['col2a'])

我需要1x3、1x4、1x5、2x3、2x4等的列组合…

以下是我将如何处理它:

def new_col(df, col1, col2):
    """
    Add a new column, modifying the dataframe inplace.

    col1: int
        column counter in the first column name
    col2: int
        column counter in the second column name
    """
    nr = (
        df.loc[:, f"col{col1}"] * df.loc[:, f"col{col1}a"]
        - df.loc[:, f"col{col2}"] * df.loc[:, f"col{col2}a"]
    )
    dr = df.loc[:, f"col{col1}a"] - df.loc[:, f"col{col2}a"]

    df.loc[:, f"col{col1}X{col2}"] = nr / dr
我将使用所需的列组合调用此函数。例如

new_col(df, 1, 2)
输出:


呼叫可能是从循环发出的。

显然,我的第一个答案只与原始问题相匹配:以下是更新问题的答案:

from itertools import combinations
from functools import partial

primary_columns = df.columns[~df.columns.str.endswith("a")]

combs = combinations(primary_columns, 2)

def column_comparison(first, second, df):
    return  (df[first]*df[first+"a"]-df[second]*df[second+"a"])/(df[first+"a"] - df[second+"a"])

dct = {'{first}X{second}'.format(first=comb[0].lstrip("col"), second=comb[1].lstrip("col")): 
       partial(column_comparison, comb[0], comb[1]) for comb in combs}
因此,我们创建了一个字典,其中包含所需列的名称和正确的函数

现在我们可以利用

取得

   col1  col1a  col2  col2a  col3  col3a         1X2         1X3          2X3
0   100      6   600      6   100      1        -inf  100.000000   700.000000
1   200     71   700     17   220     22   42.592593  191.020408 -1412.000000
2   300      8   800      8   300      3        -inf  300.000000  1100.000000
3   400     90  1900      9   440     44  233.333333  361.739130    64.571429
4   500     10   100     10   500      5         inf  500.000000  -300.000000 


在以前的版本中,我在这里使用了lambda,但这不起作用-请查看解释。我是在使用partial找到解决方案后才意识到这一点的

我想这只是设法得到产品-我需要一个不同的操作来完成…你是对的。稍后我会提供一个适当的答案。很抱歉给您带来不便,您的操作不对称。您需要1x3和3x1吗?当你除以0时会发生什么?colxa表示天数,即一个月内的天数,从而使它成为1a(30天)>2a(60天)>3a(90天),因此解决方案可以排除除以0的可能性。然而,由于我们计算的是工作日——100万的可能会随着其他月份的变化而变化——因此这里没有假设一个常数30,60,90,所以我认为你的答案对我没有帮助。无论如何,检查我的更新答案
   col1  col1a  col2  col2a  col3  col3a         1X2         1X3          2X3
0   100      6   600      6   100      1        -inf  100.000000   700.000000
1   200     71   700     17   220     22   42.592593  191.020408 -1412.000000
2   300      8   800      8   300      3        -inf  300.000000  1100.000000
3   400     90  1900      9   440     44  233.333333  361.739130    64.571429
4   500     10   100     10   500      5         inf  500.000000  -300.000000