我试图将列的切片居中(减去平均值)。因此,在下面的示例中,我将按超级搜索(组观察采用其平均值的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.DataFrame(test)#避免两个vars指向同一个对象。
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_ctr(正如预期的那样)和测试都被修改了,这让我更加困惑。
那怎么办呢? 上面的链接描述了以下作为必须保存索引值的正确方法:
dfc.loc[0,'A'] = 11
有什么东西我不见了吗?特别是在测试df被修改的情况下?
干杯谢谢!
答案 0 :(得分:0)
我不确定除了文档中的内容之外我能否为您提供一个很好的解释,但看起来您所做的工作正常并且警告并不总是适用于它出现了。
尽管如此,您可以更快,更轻松地完成您想要的内容,这与文档here中的groupby()
示例非常接近。
test[['Var1','Var2','Var3','supercase']]
Var1 Var2 Var3 supercase
0 0.107989 0.275314 0.688784 1000
1 0.743372 0.726421 0.457137 1000
2 0.946661 0.469229 0.145584 2000
3 0.562564 0.040528 0.150148 2000
4 0.213042 0.934673 0.713870 2000
5 0.851200 0.371629 0.239308 2000
6 0.555617 0.502027 0.862414 3000
7 0.386040 0.954245 0.392592 3000
8 0.431534 0.088997 0.016639 3000
9 0.207693 0.269625 0.189688 4000
test.groupby('supercase')[_vars].transform( lambda x: x - x.mean() )
Var1 Var2 Var3
0 -0.317692 -0.225554 0.115823
1 0.317692 0.225554 -0.115823
2 0.303294 0.015214 -0.166643
3 -0.080803 -0.413487 -0.162079
4 -0.430325 0.480658 0.401643
5 0.207833 -0.082386 -0.072920
6 0.097887 -0.013063 0.438533
7 -0.071691 0.439156 -0.031290
8 -0.026196 -0.426092 -0.407242
9 0.000000 0.000000 0.000000
在获取数据帧副本方面,这是标准方法:
test_ctr = test.copy()
我会猜到你尝试test_ctr = pd.DataFrame(test)
的东西也会起作用,但显然不行!