将函数应用于数据框时索引0处的KeyError

时间:2019-07-14 21:51:51

标签: python python-3.x pandas dataframe

我正在研究一个基本代码-我的目标是使用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解决了该问题-我已经知道了,为什么代码无法正常工作,我一无所知。 任何有关此问题发生原因的帮助或解释都将非常有帮助。

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