修改列的小切片的值

2024-06-26 13:45:56 发布

您现在位置:Python中文网/ 问答频道 /正文

我试着把一列的切片居中(减去平均值)。因此在下面的例子中,我将按超基搜索(组观测值取其平均值的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

有什么我不知道的吗?特别是在测试数据被修改的情况下?你知道吗

干杯,谢谢!你知道吗


Tags: thetointestdfforvarrange
1条回答
网友
1楼 · 发布于 2024-06-26 13:45:56

我不确定我能不能给你一个很好的解释,除了什么在文档中的警告,但它似乎你做的工作很好,警告并不总是适用,即使它出现。你知道吗

尽管如此,有一种更快更简单的方法来做你想做的事情,这与文档中的here示例非常接近。你知道吗

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)也能奏效,但显然不行!你知道吗

相关问题 更多 >