将dataframe列中的每个值都更改为函数返回的值

2024-09-19 23:45:50 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个数据帧,它包含一个包含字符串值的列。我需要用函数的结果替换该列中的每个值。我希望这样做,而不必迭代数千行。函数接受一个术语并返回该术语的已批准新值。你知道吗

示例getPreferredTerm('STAINED')将返回'DISCOLORED',因此p\u TERM列中'STAINED'的值将全部替换为'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

如果我给这个函数传递一个序列而不是一个单一的值,它是否可以矢量化?你知道吗


Tags: 函数indflegacycolumn术语termterms
1条回答
网友
1楼 · 发布于 2024-09-19 23:45:50

使用^{}将函数应用于序列中的每个元素:

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

请注意,这样的计算不会矢量化,也不会到位。Pandas将执行一个循环,将函数应用于序列中的每个值。结果序列随后被分配回数据帧。你知道吗


如果要使用字典映射值,可以使用pd.Series.map。此操作由熊猫优化。你知道吗

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

另一种方法是使用pd.Series.replace,但请参见note on performance。你知道吗


更新需求的矢量化方法:

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

相关问题 更多 >