我有以下代码,它的工作原理 . 这基本上重命名了列中的值,以便以后可以合并它们 .
pop = pd.read_csv('population.csv')
pop_recent = pop[pop['Year'] == 2014]
mapping = {
'Korea, Rep.': 'South Korea',
'Taiwan, China': 'Taiwan'
}
f= lambda x: mapping.get(x, x)
pop_recent['Country Name'] = pop_recent['Country Name'].map(f)
警告:尝试在DataFrame的切片副本上设置值 . 尝试使用.loc [row_indexer,col_indexer] = value,请参阅文档中的警告:http://pandas.pydata.org/pandas-docs/stable/indexing.html#indexing-view-versus-copy pop_recent ['国家名称'] = pop_recent ['国家名称'] . Map (f)
我确实谷歌了!但似乎没有任何例子使用 Map ,所以我不知所措......
2 回答
问题在于chained indexing,您实际上要做的是将值设置为 -
pop[pop['Year'] == 2014]['Country Name']
- 这在大多数情况下都不起作用(如链接文档中所解释的那样),因为这是两个不同的调用和一个调用可能会返回数据帧的副本(我相信布尔索引)正在返回数据帧的副本) .因此,当您尝试将值设置为该副本时,它不会反映在原始数据框中 . 示例 -
如上所述,您应该使用
DataFrame.loc
来索引行以及要在单个调用中更新的列,而不是链式索引,从而避免此错误 . 示例 -或者,如果这看起来太长,您可以事先创建一个掩码(布尔数据帧)并分配给变量,并在上面的语句中使用它 . 示例 -
演示 -
使用蒙版方法进行演示 -
我建议你 to reset indices 在
pop_recent = pop[pop['Year'] == 2014]
.如果要将某些函数应用于某些数据帧列,请尝试使用DataFrame API的函数apply函数 . 简单演示:
输出: