使用 iloc 设置值

机器算法验证 Python 熊猫
2022-03-06 02:06:37

combined此行返回数据框中的前 4 行feature_a

combined.iloc[0:4]["feature_a"]

正如预期的那样,下一行返回 column 数据框中的第 2、第 4 和第 16 行feature_a

combined.iloc[[1,3,15]]["feature_a"]

此行将数据框中的前 4 行设置为feature_ato 77

combined.iloc[0:4]["feature_a"] = 77

这条线做了一些事情。某种计算正在发生,因为当应用于更长的列表时需要更长的时间。

combined.iloc[[1,3,15]]["feature_a"] = 88

使用以下选项检查时,第 2、第 4 和第 16 行设置为88

combined.iloc[[1,3,15]]["feature_a"]

如何在不走大量编码弯路的情况下将数据帧列的任意行列表设置为一个值?

这种情况似乎应该非常简单和常见。

1个回答

如果您反转选择器,并首先按列选择,它将正常工作:

代码:

df.feature_a.iloc[[1, 3, 15]] = 88

为什么?

当您执行第一种(非工作方式)时,您正在选择数据框的非连续部分。您应该已经收到警告:

试图在 DataFrame 中的切片副本上设置一个值。尝试改用 .loc[row_indexer,col_indexer] = value

请参阅文档中的注意事项:http: //pandas.pydata.org/pandas- > docs/stable/indexing.html#indexing-view-versus-copy

这是因为发生了两个独立的操作。

  1. combined.iloc[[1,3,15]]创建一个只有三行的新数据框,并且必须复制该框架。然后...
  2. 通过选择一列,["feature_a"]但它是针对副本选择的。

所以任务转到副本。有多种方法可以解决此问题,但在这种情况下,先选择列,然后选择部分列进行分配更容易(也更便宜)。

测试代码:

df = pd.DataFrame(np.zeros((20, 3)), columns=['feature_a', 'b', 'c'])
df.feature_a.iloc[[1, 3, 15]] = 88
print(df)

结果:

    feature_a    b    c
0         0.0  0.0  0.0
1        88.0  0.0  0.0
2         0.0  0.0  0.0
3        88.0  0.0  0.0
4         0.0  0.0  0.0
5         0.0  0.0  0.0
6         0.0  0.0  0.0
7         0.0  0.0  0.0
8         0.0  0.0  0.0
9         0.0  0.0  0.0
10        0.0  0.0  0.0
11        0.0  0.0  0.0
12        0.0  0.0  0.0
13        0.0  0.0  0.0
14        0.0  0.0  0.0
15       88.0  0.0  0.0
16        0.0  0.0  0.0
17        0.0  0.0  0.0
18        0.0  0.0  0.0
19        0.0  0.0  0.0