使用iloc设置值


13

这条线在数据帧返回第4行combinedfeature_a

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

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

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

这条线设置在数据帧的第一4行用于feature_a77

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

这条线有作用。正在发生某种计算,因为将其应用于更长的列表时会花费更长的时间。

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

使用此检查时,将第二,第四和第十六行设置为88

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

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

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


这是仅关于编程的问题(无统计信息),因此属于堆栈溢出
Jake Westfall

如果没有最小的可重现示例,则此类问题也将在stackoverflow上
脱颖而出

Answers:


24

如果反转选择器,然后先按列进行选择,则可以正常工作:

码:

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

1
这可能有效,但是为什么呢?
马修·德鲁里
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.