我试着把一列的切片居中(减去平均值)。因此在下面的例子中,我将按超基搜索(组观测值取其平均值的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进行属性设置: 测试中心=pd.数据帧(测试)#避免两个变量指向同一对象。你知道吗
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()
这让我注意到test\u ctr(如预期的)和test都被修改了,这让我更加困惑。你知道吗
那该怎么办呢? 上面的链接将以下内容描述为保存索引值的正确方法:
dfc.loc[0,'A'] = 11
有什么我不知道的吗?特别是在测试数据被修改的情况下?你知道吗
干杯,谢谢!你知道吗
我不确定我能不能给你一个很好的解释,除了什么在文档中的警告,但它似乎你做的工作很好,警告并不总是适用,即使它出现。你知道吗
尽管如此,有一种更快更简单的方法来做你想做的事情,这与文档中的here示例非常接近。你知道吗
在获取数据帧副本方面,这是标准方法:
我猜你尝试的
test_ctr = pd.DataFrame(test)
也能奏效,但显然不行!你知道吗相关问题 更多 >
编程相关推荐