当前位置: 首页 > 知识库问答 >
问题:

为熊猫中的所有列生成列矩阵

都建树
2023-03-14

我有一个由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等等的列组合...

共有2个答案

督坚白
2023-03-14

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

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}

因此,我们创建了一个字典,其中包含所需列的名称和正确的函数。

现在我们可以利用分配

df.assign(**dct)

取得

   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找到解决方案后才意识到这一点的。

亢嘉茂
2023-03-14

以下是我将如何处理它:

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)

输出:

调用不能从循环中发出。

 类似资料:
  • 我有一个pandas dataframe对象,如下所示: 我想生成一个列表对象列表,其中第一项是列标签,其余的列表值是列数据值: 我该怎么做?谢谢你的帮助。

  • 我有一个如下所示的数据帧: 如何获取除之外的所有列?

  • 问题内容: 我有一个数据框,其中包含一列ID,其他所有列都是我要为其计算z分数的数值。这是它的一个小节: 我的某些列包含不希望包含在z分数计算中的NaN值,因此我打算使用提供给此问题的解决方案:如何使用nans将zscore归一化熊猫列? 我有兴趣将此解决方案应用于除ID列之外的所有列,以生成新的数据框,我可以使用以下格式将其另存为Excel文件: 所以基本上 如何计算每列的z分数(忽略NaN值)

  • 我正在从数据库中获取数据,我怀疑其中的所有数据都被简单地设置为string,而不是float、int等。当我将数据导入到pandas dataframe中时,所有数据都显示为字符串。 或 我试过str.isNumeric,但所有内容都显示为非数字。 我能做些什么来检测数值吗?

  • 问题内容: 我有一个数据框看起来像这样: 我如何才能获得除以外的所有列? 问题答案: 当列不是MultiIndex时,仅是列名称的数组,因此您可以执行以下操作:

  • 我试着运行一段代码,在pandas数据帧中遍历一列,如下所示: 每当我检测到一个值小于0的项目时,我都想加上1,000,000,并将结果放回dataframe中。 我试着这样做: 但是我得到了一个关键错误。 如何访问for循环的当前位置?