在pandas中规范化单个行中的值的最有效方法是什么?

yqhsw0fo  于 2023-04-19  发布在  其他
关注(0)|答案(3)|浏览(121)

我在pandas数据框中有两种类型的列,比如A和B。
如何有效地使用每种类型列的平均值分别规范化每行中的值?
我可以先计算每个列类型的平均值,然后将每个列除以其各自的列类型平均值,但这需要太多的时间(超过30分钟)。

df = pd.DataFrame({'A1': [1,2,3],
                   'A2': [4,5,6],
                   'A3': [7,8,9],
                   'B1': [11,12,13],
                   'B2': [14,15,16],
                   'B3': [17,18,19]                  
                  })

df['A_mean'] = df.apply(lambda x: x.filter(regex='A').mean(), axis=1)
df['A1'] = df['A1']/df['A_mean']

我期待以下结果。

bpsygsoo

bpsygsoo1#

下面是一种方法来完成您的问题(注意,我使用了startswith而不是filter,但如果需要,可以调整通用性):

prefixes = ['A','B']
colsByPrefix = [[col for col in df.columns if col.startswith(pref)] for pref in prefixes]
df = pd.concat([df[cols] / df[cols].mean(axis=1).to_frame().to_numpy() for cols in colsByPrefix], axis=1)

输出:

A1   A2    A3        B1   B2        B3
0  0.25  1.0  1.75  0.785714  1.0  1.214286
1  0.40  1.0  1.60  0.800000  1.0  1.200000
2  0.50  1.0  1.50  0.812500  1.0  1.187500
ars1skjm

ars1skjm2#

我只是在chatGPT中复制粘贴了同样的问题,并进行了微小的修改,它给出了一个很好的答案。

import pandas as pd

# create a sample dataframe
df = pd.DataFrame({'A1': [1,2,3],
                   'A2': [4,5,6],
                   'A3': [7,8,9],
                   'B1': [11,12,13],
                   'B2': [14,15,16],
                   'B3': [17,18,19]                  
                  })

# calculate the mean for each type of column A and B
A_mean = df.filter(regex='A').mean(axis=1)
B_mean = df.filter(regex='B').mean(axis=1)

# normalize the values in each row of column A
df[df.filter(regex='A').columns] = df.filter(regex='A').div(A_mean, axis=0)

# normalize the values in each row of column B
df[df.filter(regex='B').columns] = df.filter(regex='B').div(B_mean, axis=0)
qlckcl4x

qlckcl4x3#

运行groupby并在assign函数中解包 Dataframe :

df.assign(**df.groupby(df.columns.str[0], axis = 1).mean().add_suffix("_mean"))
   A1  A2  A3  B1  B2  B3  A_mean  B_mean
0   1   4   7  11  14  17     4.0    14.0
1   2   5   8  12  15  18     5.0    15.0
2   3   6   9  13  16  19     6.0    16.0

相关问题