我有如下数据帧
d = {'Name':['Alisa','Bobby','jodha','jack','raghu','Cathrine',
'Alisa','Bobby','kumar','Alisa','Alex','Cathrine'],
'Age':[26,24,23,22,23,24,26,24,22,23,24,24],
'Score':[85,63,55,74,31,77,85,63,42,62,89,77]}
df = pd.DataFrame(d,columns=['Name','Age','Score'])
Name Age Score
0 Alisa 26 85
1 Bobby 24 63
2 jodha 23 55
3 jack 22 74
4 raghu 23 31
5 Cathrine 24 77
6 Alisa 26 85
7 Bobby 24 63
8 kumar 22 42
9 Alisa 23 62
10 Alex 24 89
11 Cathrine 24 77
当我运行下面的代码时,它工作正常并获得如图所示的输出。每个列的新列。
a=df.columns[1:]
df[a +'rat'] = df[a]/df[a].sum()
Name Age Score Agerat Scorerat
0 Alisa 26 85 0.091228 0.105853
1 Bobby 24 63 0.084211 0.078456
2 jodha 23 55 0.080702 0.068493
3 jack 22 74 0.077193 0.092154
4 raghu 23 31 0.080702 0.038605
5 Cathrine 24 77 0.084211 0.095890
6 Alisa 26 85 0.091228 0.105853
7 Bobby 24 63 0.084211 0.078456
8 kumar 22 42 0.077193 0.052304
9 Alisa 23 62 0.080702 0.077210
10 Alex 24 89 0.084211 0.110834
11 Cathrine 24 77 0.084211 0.095890
但是,当我想使用以下代码 a 为每列创建一个Min
时,我得到错误"KeyError: "None of [Index(['Agemin', 'Scoremin'], dtype='object')] are in the [columns]"
. 我希望它创建该列!
df[a +'min'] = df[a].min()
那么,我们如何为每个列创建min()
、max()
、sum()
等列,而不必指定每个列的名称呢?
您可以使用**
从系列中assign
多个标量值来传递参数。索引将成为列名,并将值广播到所有行。对于系列add_suffix
添加到索引,而稍后我使用它添加到列名称,这是数据帧的行为方式。
import pandas as pd
df1 = df.select_dtypes('number')
df = df.assign(**df1.min().add_suffix('min'))
# Name Age Score Agemin Scoremin
#0 Alisa 26 85 22 31
#1 Bobby 24 63 22 31
#2 jodha 23 55 22 31
...
#10 Alex 24 89 22 31
#11 Cathrine 24 77 22 31
就个人而言,我会concat
另一个结果:
df = pd.concat([df, (df1/df1.sum()).add_suffix('rat')], axis=1)
# Name Age Score Agemin Scoremin Agerat Scorerat
#0 Alisa 26 85 22 31 0.091228 0.105853
#1 Bobby 24 63 22 31 0.084211 0.078456
#2 jodha 23 55 22 31 0.080702 0.068493
#...
#10 Alex 24 89 22 31 0.084211 0.110834
#11 Cathrine 24 77 22 31 0.084211 0.095890
如果您希望使用原始代码执行此操作,则可以执行以下操作:
df[a +'min'] = df[a].groupby(by=np.zeros_like(df.index)).transform(min)