簡體   English   中英

根據數據框中另一列的條件應用特定函數替換列的值

[英]Applying a specific function to replace value of column based on criteria from another column in dataframe

這是我要做的事情:

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

這是我現在擁有的:

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)

但結果不是我所期待的:

    apply_f    name         value
0   False      SEBASTIEN    NaN
1   False      JOHN         NaN
2    True      JENNY        5

該列用NaN替換初始值

它覆蓋的原因是因為左側的索引默認為整個數據幀,如果您使用loc也將掩碼應用於左側,那么它只影響滿足條件的那些行:

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是因為我使用了相同的布爾掩碼語義,這可能會或可能不會工作,並會在最新的pandas版本中引發錯誤:

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

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某些情況下使用。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM