Python 修改列的小部分的值

Python 修改列的小部分的值,python,pandas,Python,Pandas,我试着用中心减去一列切片的平均值。因此,在下面的例子中,我将通过超基搜索var,组观测值取其平均值,然后在相同的位置分配旧值减去平均值。我正在处理一个更大的数据帧477行×85列,所以我做了一个测试df来说明我的观点 import random as rd # 10 row by 3 columns dataframe with random floats test = pd.DataFrame([[rd.random() for n in range(3)] for n in range(1

我试着用中心减去一列切片的平均值。因此,在下面的例子中,我将通过超基搜索var,组观测值取其平均值,然后在相同的位置分配旧值减去平均值。我正在处理一个更大的数据帧477行×85列,所以我做了一个测试df来说明我的观点

import random as rd

# 10 row by 3 columns dataframe with random floats
test = pd.DataFrame([[rd.random() for n in range(3)] for n in range(10)], columns = ["Var{}".format(n+1) for n in range(3)])
# supercase column to group observations (rows)
test["supercase"]=[1000]*2+[2000]*4+[3000]*3+[4000]
# random metadata for fluff
for n,_lett in zip(range(3),list("abc")):
    test["metadata{}".format(n+1)]=[_lett*int(rd.random()*10) for i in range(len(test.index))]

# get the vars I want to work on
_vars = test.columns[:3]
# get a list of supercases to work on
supercases = test.supercase.unique()

# go through the calculations
for var in _vars:
    for sc in supercases:
        test[var][test.supercase == sc]=test[var][test.supercase == sc]-test[var][test.supercase == sc].mean()
我意识到只有一个观察值的组的中心值为零

然而,在使用原始df等待了相当长一段时间后,我得到以下警告:

C:\Python27\lib\site-packages\IPython\kernel\__main__.py:5: SettingWithCopyWarning: 
A value is trying to be set on a copy of a slice from a DataFrame

See the the caveats in the documentation: http://pandas.pydata.org/pandas-docs/stable/indexing.html#indexing-view-versus-copy
我不确定这到底意味着什么,所以我尝试创建df的副本,并对新df进行属性设置: test_ctr=pd.DataFrametest以避免两个变量指向同一个对象

for var in _vars:
    for sc in supercases:
        test_ctr[var][test_ctr.supercase == sc]=test[var][test.supercase == sc]-test[var][test.supercase == sc].mean()
这让我注意到,测试和测试都被修改了,这让我更加困惑

那么应该如何做呢? 上面的链接将以下内容描述为保存索引值的正确方法:

dfc.loc[0,'A'] = 11
有什么我遗漏的吗?特别是在修改测试df的情况下


干杯,谢谢

除了文档中的内容之外,我不确定我是否能给你一个很好的解释,但你所做的似乎很好,而且即使出现警告,也不总是适用

尽管如此,有一种更快捷、更简单的方法可以实现您想要的功能,它与文档中的groupby示例非常接近

在获取数据帧副本方面,这是标准的方法:

test_ctr = test.copy()

我猜想您尝试的test\u ctr=pd.DataFrametest也会起作用,但显然不起作用

非常感谢groupby,事实上我还不习惯。我希望test_ctr=pd.DataFrametest能够工作,因为它是您使用基本对象(例如x=listy)进行测试的方式!
test_ctr = test.copy()