将数据框列中的每个值更改为函数返回的值

时间:2018-04-18 13:48:02

标签: python pandas numpy dataframe

我的数据框包含一个包含字符串值的列。我需要用函数的结果替换该列中的每个值。我想在没有迭代数千行的情况下这样做。该函数使用一个术语并返回该术语的已批准新值。

示例getPreferredTerm('STAINED')将返回' DISCOLORED'所以' STAINED' P_TERM列中的所有内容都将替换为' DISCOLORED'。

我正在努力使用numpy来实现这一目标。

df['P_TERM'] = getPreferredTerm(df['P_TERM'])

getPreferredTerm函数如下:

def getPreferredTerm(stresc): 
    # NOTE" obsData is a dataframe containing legacy terms in a 
    # column called 'STRESC' and preferred terms in a column 
    # named 'PTERM' so this function takes a legacy term as input 
    # and returns a preferred term 
    try:    
        df = obsData.loc[(obsData['STRESC'] == stresc)].iloc[0]['P_TERM'] 
        pterm = df 
    except Exception as e:  
        pterm = 'UNMAPPED' 
    return pterm

如果我传递一个系列而不是单个值,是否可以对此函数进行矢量化?

1 个答案:

答案 0 :(得分:0)

使用pd.Series.apply将函数应用于系列中的每个元素:

df['P_TERM'] = df['P_TERM'].apply(getPreferredTerm)

请注意,此类计算不会进行矢量化,也不会就地计算。 Pandas将执行循环以将您的函数应用于系列中的每个值。然后将生成的序列分配回数据帧。

如果您想使用字典来映射您的值,可以使用pd.Series.map。此操作由Pandas优化。

d = {'STAINED': 'DISCOLORED'}
df['P_TERM'] = df['P_TERM'].map(d).fillna(df['P_TERM'])

另一种方法是使用pd.Series.replace,但请参阅此note on performance

用于更新要求的Vectorised方法:

s = obsData.drop_duplicates(subset=['STRESC']).set_index('STRESC')['P_TERM']
df['P_TERM'] = df['P_TERM'].map(s).fillna('UNMAPPED')