Python 将dataframe列中的每个值更改为函数返回的值
我有一个dataframe,它包含一个包含字符串值的列。我需要用函数的结果替换该列中的每个值。我希望这样做,而不必重复数千行。函数接受一个术语并返回该术语的已批准新值 示例:Python 将dataframe列中的每个值更改为函数返回的值,python,pandas,numpy,dataframe,Python,Pandas,Numpy,Dataframe,我有一个dataframe,它包含一个包含字符串值的列。我需要用函数的结果替换该列中的每个值。我希望这样做,而不必重复数千行。函数接受一个术语并返回该术语的已批准新值 示例:getPreferredTerm('DISCOLORED')将返回'DISCOLORED',因此p_TERM列中'DISCOLORED'的值将全部替换为'DISCOLORED' 我正在努力使用numpy来实现这一点 df['P_TERM'] = getPreferredTerm(df['P_TERM']) getPrefe
getPreferredTerm('DISCOLORED')
将返回'DISCOLORED',因此p_TERM列中'DISCOLORED'的值将全部替换为'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
如果我传递一个序列而不是单个值,是否可以将此函数矢量化?用于将函数应用于序列中的每个元素:
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
,但请参见此
用于更新需求的矢量化方法:
s = obsData.drop_duplicates(subset=['STRESC']).set_index('STRESC')['P_TERM']
df['P_TERM'] = df['P_TERM'].map(s).fillna('UNMAPPED')
这会比遍历每一行更快吗?有更好的方法吗?这不会比迭代每一行更快。如果您想要矢量化方法,则需要向我们显示
getPreferredTerm
的代码,该代码可能是矢量化的,也可能不是矢量化的。def getobbsterm(stresc):#注意“obsData是一个数据帧,包含名为'STRESC'的列中的遗留术语和名为'PTERM'的列中的首选术语,因此此函数将遗留术语作为输入,并返回首选术语try:df=obsData.loc[(obsData['STRESC'==STRESC)]。iloc[0]['P\u term']pterm=df,异常情况除外,如e:pterm='unmap'返回pterm@summersmd,很抱歉,我无法阅读您评论中的代码。如果您需要提供更多数据/代码,请回答您的问题。@summersmd,请参阅更新。您尚未提供具有预期输出的数据,因此我无法测试这是否是您想要的。