基于另一个创建新列而不抛出警告

问题描述 投票:1回答:1

我有一个带有'agepreg'列的dataFrame live(活产),这是一个带有两个小数位的浮点数。我想创建一个新列'agepreg_rounded'作为整数。

我天真的做法:

live['agepreg_rounded'] = live['agepreg'].apply(lambda x: round(x,0))

有效,但会发出警告:

/usr/local/lib/python3.5/dist-packages/ipykernel/__main__.py:4: SettingWithCopyWarning: 
A value is trying to be set on a copy of a slice from a DataFrame.
Try using .loc[row_indexer,col_indexer] = value instead

See the caveats in the documentation: http://pandas.pydata.org/pandas-docs/stable/indexing.html#indexing-view-versus-copy

我已多次尝试使用.loc语法,但失败了。

谁能让我直截了当?

这是我想写的东西,但这显然是错误的:

live['agepreg_rounded'] = live.loc[live['agepreg']].apply(lambda x: round(x,0))

更新:生活从何而来?

我正在关注来自O'Reilly的ThinkStats2书,数据来自使用源材料下载的文件:

import nsfg
preg = nsfg.ReadFemPreg()
live = preg[preg.outcome == 1]
pandas dataframe
1个回答
1
投票

我认为你需要copy然后apply使用Series.round

live = preg[preg.outcome == 1].copy()
live['agepreg_rounded'] = live['agepreg'].round(0)

如果您稍后修改live中的值,您会发现修改不会传播回原始数据(preg),并且Pandas会发出警告。

© www.soinside.com 2019 - 2024. All rights reserved.