首页 > 解决方案 > DataFrame 按其他列应用过滤

问题描述

我可以通过过滤具有另一个列值的行来将函数应用于数据框列吗?

我的实际代码是:

df['description_text_clean'] = df.description_text_clean[df['language']!='en'].apply(translate_to_en)

我试图通过非英语的语言来过滤语言列,并且我想翻译 description_text_clean 列。但最后我发现 description_text_clean 列已被 NaN 在英文列中修改,我希望它们继续原样。

示例数据框:

df = pd.DataFrame([['Example text', 'en'], 
                   ['No es ingles', 'es'], 
                   ['I am again english', 'en']], 
                   columns=['description_text_clean', 'language'])

实际结果:

    description_text_clean  language
0   NaN                       en
1   It is not English         es
2   NaN                       en

期望的结果是使用使用 google translate api 的translate_to_en函数获得一个将所有文本翻译成英文的数据框:

    description_text_clean  language
0   Example text              en
1   It is not English         es
2   I am again english        en

有什么建议吗?

标签: pythonpandasdataframeapply

解决方案


糟糕的是,我在评论中遗漏了一个小细节,请尝试使用.loc[]series.maskseries.combine_firstnp.where

df.loc[df['language'].ne('en'),'description_text_clean']  = (
                     df['description_text_clean'].map(fun))

或者:

(df.loc[df['language'].ne('en'),'description_text_clean'].map(translate_to_en)
  .combine_first(df.description_text_clean))

或者:

df['description_text_clean'].mask(df['language'].ne('en')
                                  ,df['description_text_clean'].map(translate_to_en))

甚至np.where

np.where(df['language'].ne('en'),
        df['description_text_clean'].map(fun),df['description_text_clean'])

用虚拟功能测试:

def fun(x):
    return  1
df['description_text_clean'] =(df.loc[df['language'].ne('en'),'description_text_clean']
                      .map(fun).combine_first(df.description_text_clean))

或者:

df['description_text_clean'] = df['description_text_clean'].mask(df['language'].ne('en')
                              ,df['description_text_clean'].map(fun))
print(df)

  description_text_clean language
0           Example text       en
1                      1       es
2     I am again english       en

推荐阅读