如何在不使用列名的情况下对Pandas中的多列进行操作?

How to perform operation to multiple columns in Pandas without using column names?

我有一个包含大量列的数据集。我想对所有这些列执行一般计算并获得最终值并将其作为新列应用。

例如,我有如下数据框

      A1       A2       A3      ...   A120
0    0.12     0.03     0.43     ...   0.56
1    0.24     0.53     0.01     ...   0.98
.     ...       ...     ...     ...    ...
200   0.11     0.22     0.31     ...   0.08

我想用新的列计算构建一个类似于下面的数据框。

calc = (A1**2 - A1) + (A2**2 - A2) ... (A120**2 - A120)

最终的数据框应该是这样的

      A1       A2       A3      ...   A120   calc
0    0.12     0.03     0.43     ...   0.56    x
1    0.24     0.53     0.01     ...   0.98    y
.     ...       ...     ...     ...    ...   ...
200   0.11     0.22     0.31    ...   0.08    n

我试着用 python 来做到这一点,如下所示

import pandas as pd

df = pd.read_csv('sample.csv')

def construct_matrix():
    temp_sumsqc = 0
    for i in range(len(df.columns)):
        column_name_construct = 'A'+f'{i}'
        temp_sumsqc += df[column_name_construct] ** 2 - (df[column_name_construct])
    df["sumsqc"] = temp_sumsqc


matrix_constructor()
print(df_read.to_string())

但这会引发 KeyError: 'A1

很难做到df["A1"]**2 - df["A1"] + df["A2"]**2 - df["A2"] + ...,因为有 120 列。

由于我尝试的方法没有奏效,我想知道是否有更好的方法来做到这一点?

您可以使用 df.apply 为每一列执行代码,然后使用 sum(axis=1) 对各列的结果值求和:

df['sumsqc'] = df.apply(lambda col: (col ** 2) - col).sum(axis=1)

输出:

>>> df
       A1    A2    A3  A120  sumsqc
0    0.12  0.03  0.43  0.56 -0.6262
1    0.24  0.53  0.01  0.98 -0.4610
200  0.11  0.22  0.31  0.08 -0.5570

请注意 A1**2 - A1 等同于 A1 * (A1 - 1),因此您可以

df['sumsqc'] = df.apply(lambda col: col * (col - 1)).sum(axis=1)

不用for循环,这里可以用向量化的方式

df['calc'] = df.pow(2).sub(df).sum(1)