如何修复“大小”,“发生在索引城市”错误

时间:2019-10-20 03:35:54

标签: python pandas lambda

我正在尝试使用Python和Pandas中的示例将“大小”列中的NaN替换为特定值,具体取决于城市。在下面的示例中,如果城市为圣路易斯,我尝试将值设置为18。

我使用了lambda函数来执行此操作,因为原始数据帧中有很多行具有重复的City名称,并且只有少数具有NaN值。
当我运行代码时,出现错误-KeyError :(“大小”,“发生在索引城市”)

下面是代码段-

raw_data = {'City' : ['Dallas', 'Chicago', 'St Louis', 'SFO', 'St Louis'],
            'size': [24, 36, 'NaN', 'NaN', 22],
            'Type' : ['Pie', 'Hallo', 'Zombi', 'Dru', 'Zoro']
}

df = pd.DataFrame(raw_data)
df

df['size'] = df.apply(lambda x : x['size'].fillna(value = 18 if x['City' == 'St Louis'] else x['size'], axis = 1, inplace = True))
df

预期-在圣路易斯的尺寸栏中填充18 实际-KeyError :(“大小”,“出现在索引城市”)

2 个答案:

答案 0 :(得分:1)

如果您要做的只是设置圣路易斯的大小,则可以运行:

df.loc[df['City'] == 'St Louis', 'size'] = 18

但是,如果您想将NaN的所有值都设置为18,则可以运行:

df.loc[df['size'] == 'NaN', 'size'] = 18

如果您只想设置大小为NaN的所有圣路易斯条目的大小,则可以执行以下操作:

df.loc[df['City'] == 'St Louis' and df['size'] == 'NaN', 'size'] = 18

答案 1 :(得分:0)

通过 fillna 方法有一个简单的解决方案

df['size'] = df['size'].fillna(18)

已编辑

我没注意到的是-您用 NaN 字符串填充单元格,而不用真正的 NaN 值填充单元格。

如果您将输入数据更改为

raw_data = {'City' : ['Dallas', 'Chicago', 'St Louis', 'SFO', 'St Louis'],
            'size': [24, 36, np.NaN, np.NaN, 22],
            'Type' : ['Pie', 'Hallo', 'Zombi', 'Dru', 'Zoro']
}

然后,以下方法将允许您通过城市名称重新填充 size 列单元格

df = pd.DataFrame(raw_data)
df[['City', 'size']] = df.set_index('City')['size'].fillna({'St Louis': 18, 'SFO': 20}).reset_index()