LPR*_*LPR 7 python apply attributeerror dataframe pandas
如何根据条件将NaN值转换为分类值.我在尝试转换Nan值时遇到错误.
category gender sub-category title
health&beauty NaN makeup lipbalm
health&beauty women makeup lipstick
NaN NaN NaN lipgloss
Run Code Online (Sandbox Code Playgroud)
我的DataFrame看起来像这样.我将性别中的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)
Run Code Online (Sandbox Code Playgroud)
如果我运行代码我会收到错误
----> 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')
Run Code Online (Sandbox Code Playgroud)
cs9*_*s95 13
这里要注意的一些事情 -
apply超过4列是浪费apply一般来说,呼叫是浪费的,因为它很慢并且不会给您带来任何矢量化优势.str访问器pd.Series.title.contains就足够了.或者更诡异,"lip" in title.gender.isnull是完全错误的,gender是一个标量,它没有isnull属性选项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
Run Code Online (Sandbox Code Playgroud)
这不仅快速,而且更简单.如果您担心区分大小写,可以使您的contains检查区不敏感 -
m = df.gender.isnull() & df.title.str.contains('lip', flags=re.IGNORECASE)
Run Code Online (Sandbox Code Playgroud)
选项2
另一种选择是使用pd.Series.mask/ pd.Series.where-
df['gender'] = df.gender.mask(m, 'women')
Run Code Online (Sandbox Code Playgroud)
要么,
df['gender'] = df.gender.where(~m, 'women')
Run Code Online (Sandbox Code Playgroud)
df
category gender sub-category title
0 health&beauty women makeup lipbalm
1 health&beauty women makeup lipstick
2 NaN women NaN lipgloss
Run Code Online (Sandbox Code Playgroud)
在mask隐式应用的新的价值基础上提供的面具列.
或者只使用loc作为@ COLDSPEED答案的选项3
cond = (df['gender'].isnull()) & (df['title'].str.contains('lip'))
df.loc[cond, 'gender'] = 'women'
category gender sub-category title
0 health&beauty women makeup lipbalm
1 health&beauty women makeup lipstick
2 NaN women NaN lipgloss
Run Code Online (Sandbox Code Playgroud)