python - 通过整数索引选择和修改 Pandas 数据框中的切片

标签 python pandas indexing

我有一个如下所示的数据框:

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 列值上)和行选择(通过子数据框中行的排名)来更改值, 而不是它的索引值)?

最佳答案

使用带有 bool 掩码的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,这将返回一个 bool 数组,我们屏蔽 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]] = 3chained indexing这就是发出警告的原因。

关于python - 通过整数索引选择和修改 Pandas 数据框中的切片,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44670146/

相关文章:

sqlite - 索引 SQLite 数据库 : Empty Index ?

c - 索引内存指针数组与 ANSI C 中的间接整数索引数组

python - "IndexError: positional indexers are out-of-bounds"当他们显然不是

python - 使用 pandas python 中另一个数据框中另一列的索引更新数据框中的列

python - 将数组的 Python 字典转换为数据框

python - Pandas 分层索引 - 不适用于数据框?

SQL Server - 存储过程突然变慢

Python解析模块执行Query.filter或Query.get时出错

python - 如何检测从 pb.Root 继承的服务器中丢失的客户端连接?

使用 Data Nitro 时的 Python shell 问题