我的数据框包含一个包含字符串值的列。我需要用函数的结果替换该列中的每个值。我想在没有迭代数千行的情况下这样做。该函数使用一个术语并返回该术语的已批准新值。
示例: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
如果我传递一个系列而不是单个值,是否可以对此函数进行矢量化?
答案 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')