修改列

时间:2015-04-29 09:23:33

标签: 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(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被修改的情况下?

干杯谢谢!

1 个答案:

答案 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)的东西也会起作用,但显然不行!