为什么使用 pandas apply 时会出现 AttributeError 错误?

2023-11-26

我应该如何根据条件将 NaN 值转换为分类值。我在尝试转换 Nan 值时遇到错误。

category           gender     sub-category    title

health&beauty      NaN         makeup         lipbalm

health&beauty      women       makeup         lipstick

NaN                NaN         NaN            lipgloss

我的数据框看起来像这样。我将性别中的 NaN 值转换为分类值的函数如下所示

def impute_gender(cols):
    category=cols[0]
    sub_category=cols[2]
    gender=cols[1]
    title=cols[3]
    if title.str.contains('Lip') and gender.isnull==True:
        return 'women'
df[['category','gender','sub_category','title']].apply(impute_gender,axis=1)

如果我运行代码,我会收到错误

----> 7     if title.str.contains('Lip') and gender.isnull()==True:
      8         print(gender)
      9 

AttributeError: ("'str' object has no attribute 'str'", 'occurred at index category')

完整数据集 -https://github.com/lakshmipriya04/py-sample


这里需要注意一些事情 -

  1. 如果您只使用两列,请调用apply超过 4 列是浪费
  2. Calling apply既浪费又低效,因为它很慢,使用大量内存,并且没有为您提供矢量化优势
  3. 在应用中,您正在处理标量,因此您不使用.str访问器就像你一样pd.Series目的。title.contains就足够了。或者更Python地讲,"lip" in title.
  4. gender.isnull对口译员来说听起来完全错误,因为gender是一个标量,它没有isnull属性

Option 1
np.where

m = df.gender.isnull() & df.title.str.contains('lip')
df['gender'] = np.where(m, 'women', df.gender)

df
        category gender sub-category     title
0  health&beauty  women       makeup   lipbalm
1  health&beauty  women       makeup  lipstick
2            NaN  women          NaN  lipgloss

这不仅速度快,而且更简单。如果您担心区分大小写,您可以将contains检查不区分大小写 -

m = df.gender.isnull() & df.title.str.contains('lip', flags=re.IGNORECASE)

Option 2
另一种选择是使用pd.Series.mask/pd.Series.where -

df['gender'] = df.gender.mask(m, 'women')

Or,

df['gender'] = df.gender.where(~m, 'women')

df
        category gender sub-category     title
0  health&beauty  women       makeup   lipbalm
1  health&beauty  women       makeup  lipstick
2            NaN  women          NaN  lipgloss

The mask根据提供的掩码将新值隐式应用于列。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

为什么使用 pandas apply 时会出现 AttributeError 错误? 的相关文章

随机推荐