Iretarting over column并为每个列创建 min() 列



我有如下数据帧

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)

最新更新