我正在研究一个基本代码-我的目标是使用gender_guesser.detector在数据帧中找到行的性别,而从CSV导入的文件将缺少这些值。为了简单起见,我只是在下面的代码中创建了一个虚拟数据框。
我对Python来说还很陌生,并且在学习阶段非常多,所以我认为对于我想做的事情肯定有更优雅的解决方案。我的想法是添加一个新列,使用上述函数查找每一行的值,然后填写NaN值,同时将原始性别值保留在适用的位置(完成后删除temp列)。 如果我将其手动应用于特定行并且Jupyter也接受该功能,则d.get_gender部分将起作用。
df = pd.DataFrame([['Adam','Smith',''],['Lindsay','Jackson','M'],['Laura','Jones','F'],['Arthur','Jackson','']] ,columns=['first_name','last_name','gender'])
import gender_guesser.detector as gender
df['newgender']=""
def findgender(dataframe):
for row in dataframe:
d = gender.Detector()
df.loc[row, 'newgender'] = d.get_gender(df.loc[row,'first_name'])
return df
df.apply(findgender, axis=1)
当我尝试将其应用于数据框时,收到一条冗长的错误消息,最后一行是 KeyError :(“ Adam”,“发生在索引0”)
我试图在此处查找类似的帖子,但是对于大多数情况,添加axis = 1解决了该问题-我已经知道了,为什么代码无法正常工作,我一无所知。 任何有关此问题发生原因的帮助或解释都将非常有帮助。
答案 0 :(得分:0)
我不确定您为什么会收到该错误。通常,最好避免逐行访问数据帧。以下解决方案似乎可以使用lambda函数工作。
import pandas as pd
import gender_guesser.detector as gender
df = pd.DataFrame([['Adam','Smith',''],['Lindsay','Jackson','M'],['Laura','Jones','F'],['Arthur','Jackson','']] ,columns=['first_name','last_name','gender'])
df['newgender'] = df['first_name'].apply(lambda x: gender.Detector().get_gender(x))
它产生以下结果。
first_name last_name gender newgender
0 Adam Smith male
1 Lindsay Jackson M mostly_female
2 Laura Jones F female
3 Arthur Jackson male