如何在不使用列名的情况下对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)
我有一个包含大量列的数据集。我想对所有这些列执行一般计算并获得最终值并将其作为新列应用。
例如,我有如下数据框
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)