Pandas根据布尔数组修改列值

pro*_*der 8 python pandas

我知道如何使用applynp.where基于另一列的值创建新列,但是有选择地更改现有列的值的方法正在逃避我; 我怀疑df.ix是参与?我接近了吗?

例如,这是一个简单的数据帧(我的数据行有数万行).如果名称以字母'e'结尾,我想更改'flag'列中的值(假设为'Blue'):

>>> import pandas as pd
>>> df = pd.DataFrame({'name':['Mick', 'John', 'Christine', 'Stevie', 'Lindsey'], \
        'flag':['Purple', 'Red', nan, nan, nan]})[['name', 'flag']]
>>> print df

        name    flag
0       Mick  Purple
1       John     Red
2  Christine     NaN
3     Stevie     NaN
4    Lindsey     NaN
[5 rows x 2 columns]
Run Code Online (Sandbox Code Playgroud)

我可以根据我的标准制作一个布尔系列:

>boolean_result = df.name.str.contains('e$')
>print boolean_result
0    False
1    False
2     True
3     True
4    False
Name: name, dtype: bool
Run Code Online (Sandbox Code Playgroud)

我只需要关键步骤来获得以下结果:

>>> print result_wanted
        name    flag
0       Mick  Purple
1       John     Red
2  Christine    Blue
3     Stevie    Blue
4    Lindsey     NaN
Run Code Online (Sandbox Code Playgroud)

U2E*_*EF1 12

df['flag'][df.name.str.contains('e$')] = 'Blue'
Run Code Online (Sandbox Code Playgroud)

  • 我不认为这种链式作业不推荐?当我发现这种赋值的一些非常奇怪的效果时,我几乎总是使用.loc.我的意思是它在这里显然有效,但总的来说,我认为这是应该避免的.那是你的理解吗? (2认同)
  • @WoodyPride对于使用布尔向量进行索引,这非常好,如果你想添加其他形式的索引,你会想要`loc`.例如:`df.loc [df.name.str.contains('e $'),'flag'] ='Blue'.你关注观点与副本是对的.颠倒访问顺序(对我来说)会出错:`df [df.name.str.contains('e $')] ['flag'] ='Blue' (2认同)
  • 实际上,当我在具有[ab] c | d [ef]公式的长正则表达式的真实数据上使用此方法时,pandas会返回一个警告,我可能想要使用str.extract.在这种情况下,它可以,因为我希望任何适合任何模式的记录具有相同的标签,但我可以看到为什么需要小心使用此方法. (2认同)