在应用函数后,在DataFrame中更改系列

时间:2015-05-16 14:16:53

标签: python pandas

我尝试使用pandas来使用简单的功能就地更改我的一个列。

在阅读整个Dataframe之后,我尝试在一个Serie上应用函数:

wanted_data.age.apply(lambda x: x+1)

它工作得很好。当我尝试将其放回我的DataFrame时,唯一的问题就出现了:

wanted_data.age = wanted_data.age.apply(lambda x: x+1)

或:

wanted_data['age'] = wanted_data.age.apply(lambda x: x+1)

发出以下警告:

> C:\Anaconda\lib\site-packages\pandas\core\generic.py:1974:
> 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 the caveats in the documentation:
> http://pandas.pydata.org/pandas-docs/stable
> /indexing.html#indexing-view-versus-copy   self[name] = value

当然,我可以使用以下的长格式设置DataFrame:

wanted_data.loc[:, 'age'] = wanted_data.age.apply(lambda x: x+1)

但是,没有别的,更容易,语法更好的方法吗?

谢谢!

3 个答案:

答案 0 :(得分:7)

使用loc

wanted_data.loc[:, 'age'] = wanted_data.age.apply(lambda x: x + 1)

答案 1 :(得分:3)

我会建议 wanted_data['age']= wanted_data['age'].apply(lambda x: x+1),然后将文件另存为 wanted_data.to_csv(fname,index=False), 在哪里" fname"是要更新的文件的名称。

答案 2 :(得分:0)

我无法发表评论,因此我将其保留为答案。

由于链式索引是在内部进行捆绑的方式,因此您可能会获得较深的副本,而不是对初始DataFrame的引用(有关更多信息,请参见链式分配-this is a very good source。Bare .loc []始终返回a参考)。因此,您可能无法分配回DataFrame,而是分配给它的副本。另一方面,您的格式可能会返回对初始Dataframe的引用,并且在对它进行变异的同时,初始DataFrame也将变异。 Python会打印此警告以应对这种情况,以便用户可以决定这是否是所需的治疗方法。

如果您知道自己在做什么,则可以使用以下方法使警告静音:

with pd.options.mode.chained_assignment = "None":
    wanted_data.age = wanted_data.age.apply(lambda x: x+1)

如果您认为这是一种重要的方式(例如,可能会无意间更改初始DataFrame),则可以将上述选项设置为“ raise”,这样就会引发错误而不是警告。

此外,我认为使用“就地”一词并不完全正确。在某些方法中,“ inplace”用作参数,以便在不将对象分配给自身的情况下对其进行突变(分配在内部进行分配),apply()不支持此功能。