pandas - 根据条件添加列

时间:2015-11-03 14:13:02

标签: python pandas dataframe slice

从简单的数据框df开始,如:

C,n
AAA,1
AAA,2
BBB,1
BBB,2
CCC,1
CCC,2
DDD,1
DDD,2

我想根据C列中值的某些条件添加一列。我要添加的专栏是:

df['H'] = df['n'] / 10

返回:

     C  n    H
0  AAA  1  0.1
1  AAA  2  0.2
2  BBB  1  0.1
3  BBB  2  0.2
4  CCC  1  0.1
5  CCC  2  0.2
6  DDD  1  0.1
7  DDD  2  0.2

现在我想添加相同的列,但仅针对CCC列中的值DDDC使用不同的归一化因子,例如:

df['H'] = df['n'] / 100

这样:

     C  n    H
0  AAA  1  0.1
1  AAA  2  0.2
2  BBB  1  0.1
3  BBB  2  0.2
4  CCC  1  0.01
5  CCC  2  0.02
6  DDD  1  0.01
7  DDD  2  0.02

到目前为止,我试图将数据框掩盖为:

mask = df['C'] == 'CCC'
df = df[mask]
df['H'] = df['n'] / 100

这对蒙面样本有效。但是,由于我必须应用多个过滤器,保留原始H列的未过滤值,我会感到困惑。

3 个答案:

答案 0 :(得分:3)

df.loc[df['C'] == 'CCC' , 'H'] = df['n'] / 100 

答案 1 :(得分:2)

也可以使用iloc

df.ix[df['C'].isin(['CCC','DDD']),['H']] =  df['n'] / 100

答案 2 :(得分:1)

使用this answer中的示例,您可以使用:

df['H'][mask] = df['H'][mask]/100

您还可以单独计算H列(' CCC' /' DDD'或不是' CCC' /' DDD') :

import numpy as np
mask = np.logical_or(df['C'] == 'CCC', df['C']=='DDD')
not_mask = np.logical_not(mask)
df['H'][not_mask] = df['H'][not_mask]/10
df['H'][mask] = df['H'][mask]/100