繁体   English   中英

按整数索引选择并修改pandas数据帧中的切片

[英]Select and modify a slice in pandas dataframe by integer index

我有一个如下数据框:

df = pd.DataFrame([[1,2],[10,20],[10,2],[1,40]],columns = ['a','b'])
    a   b
0   1   2
1   10  20
2   10  2
3   1   40

我想选择a == 1b列,以下是经典选择:

df[df.a == 1].b
    a   b
0   1   2
3   1   40

然后我想选择这个子数据帧的第i行,这不是索引为i的行。 还有几种方法,如下所示:

df[df.a == 1].b.iloc[[1]]
Output: 
3    40
Name: b, dtype: int64

到现在为止还挺好。 问题是当我尝试修改我到达那里的值时,实际上这个选择方法会产生数据帧切片的副本,而不是对象本身。 因此我无法在原地进行修改。

test[test.a == 1].b.iloc[[1]] = 3
SettingWithCopyWarning:
A value is trying to be set on a copy of a slice from a DataFrame

我不知道“复制”问题在哪个部分,因为以下两个产生同样的问题:

test.iloc[[3]].b = 3
test[test.a == 1].b = 3

所以我的问题是这样的一个:我怎么能双方蒙版选区(有条件的改变值a列值)和行选择(通过行中subdataframe,而不是它的指标值排名)?

使用带有布尔掩码的loc并直接传递索引:

In[178]:
df.loc[df.loc[df['a'] == 1,'b'].index[1], 'b'] = 3
df

Out[178]: 
    a   b
0   1   2
1  10  20
2  10   2
3   1   3

所以这里我们使用df['a'] == 1来掩盖df,这将返回一个布尔数组,我们屏蔽df并选择列'b'

In[179]:
df.loc[df['a'] == 1,'b']

Out[179]: 
0    2
3    40
Name: b, dtype: int64

然后直接下标索引:

In[180]:
df.loc[df['a'] == 1,'b'].index[1]

Out[180]: 3

然后我们可以将此索引标签传递回顶级loc

test[test.a == 1].b.iloc[[1]] = 3链式索引 ,这就是提出警告的原因。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM