首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >应用特定的函数来根据dataframe中另一列的标准替换列的值

应用特定的函数来根据dataframe中另一列的标准替换列的值
EN

Stack Overflow用户
提问于 2014-09-12 10:05:00
回答 1查看 2.9K关注 0票数 3

以下是我想要做的事:

代码语言:javascript
复制
Dataframe before: 
       name         value    apply_f
0      SEBASTIEN    9        false
1      JOHN         4        false
2      JENNY        np.inf   true

Apply function f: len(df['name']) to columns 'value' only if columns 'apply_f' == True 

Dataframe after: 
       name       value    apply_f
0      SEBASTIEN  9        False
1      JOHN       4        False
2      JENNY      5        True

以下是我目前的情况:

代码语言:javascript
复制
from pandas import *
from numpy import *

df = DataFrame( { "name":  ['SEBASTIEN', 'JOHN', 'JENNY'] , 
                  "value": [9, 4, np.inf] , 
                  "apply_f":  [False,False,True]} )

def f(x):
    return len(x)

df['value'] = df[df['apply_f'] == True]['name'].apply(f)

但结果不是我所期望的:

代码语言:javascript
复制
    apply_f    name         value
0   False      SEBASTIEN    NaN
1   False      JOHN         NaN
2    True      JENNY        5

列用NaN替换初始值。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-09-12 10:16:32

它覆盖的原因是左侧的索引默认为整个数据格式,如果您同时使用loc将掩码应用到左手,那么它只会影响满足条件的行:

代码语言:javascript
复制
In [272]:

df.loc[df['apply_f'] == True, 'value'] = df[df['apply_f'] == True]['name'].apply(lambda row: f(row))
df
Out[272]:
  apply_f       name  value
0   False  SEBASTIEN      9
1   False       JOHN      4
2    True      JENNY      5

在上面使用loc是因为假设我使用了相同的布尔掩码语义,这可能有效,也可能不起作用,并将在最新的熊猫版本中引发一个错误:

代码语言:javascript
复制
In[274]:
df[df['apply_f'] == True]['value'] = df[df['apply_f'] == True]['name'].apply(lambda row: f(row))
df
-c:8: SettingWithCopyWarning: A value is trying to be set on a copy of a slice from a DataFrame.
Try using .loc[row_index,col_indexer] = value instead
Out[274]:
  apply_f       name     value
0   False  SEBASTIEN  9.000000
1   False       JOHN  4.000000
2    True      JENNY       inf

对于您正在做的事情,使用numpy where将更加简洁和可读性更强。

代码语言:javascript
复制
In [279]:

df['value'] = np.where(df['apply_f']==True, len(df['name']), df['value'])
df
Out[279]:
  apply_f       name  value
0   False  SEBASTIEN      9
1   False       JOHN      4
2    True      JENNY      3

我理解您的示例是演示一个问题,但您也可以在某些情况下使用where

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/25805756

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档