【问题标题】:Pandas: Re-assigning values to a 'block' of a Data framePandas:将值重新分配给数据框的“块”
【发布时间】:2013-05-09 07:57:08
【问题描述】:

可能是一个微不足道的问题,但我需要了解这里发生了什么(以及如何解决它)。

假设我有一个包含“a”和“b”列的数据框,如下所示:

f = pandas.DataFrame({'a':[1,2,3,4,5], 'b':[10,20,30,40,50]})

现在对于 'a' 的每个小于等于 3 的元素,我想将 'b' 的对应元素除以 10。

f[f['a']<=3]['b'] = (f[f['a']<=3]['b'])/10

所以“b”列中的值现在应该是 [1,2,3,40,50]。

但我发现“b”列保持不变!什么给了?

【问题讨论】:

标签: pandas dataframe


【解决方案1】:

我认为您正在尝试将值分配给副本而不是视图(f[f['a']&lt;=3]['b'] 是副本),请参阅Returning a view versus a copy

但是,您可以重新排序,它会成为一个视图:

In [11]: f['b'][f['a']<=3] = (f[f['a']<=3]['b'])/10

In [12]: f
Out[12]:
   a   b
0  1   1
1  2   2
2  3   3
3  4  40
4  5  50

【讨论】:

  • 要详细说明 Andy 的答案,请阅读 pandas.pydata.org/pandas-docs/dev/… 以了解正在发生的事情。
  • @DanAllan 只是用相同的链接填写它:)
  • @AndyHayden,希望在“返回视图与复制”部分中有更多示例,因为在这方面似乎有很多问题(和困惑)......
  • @Jeff 同意,我会尝试把一些东西放在一起。 这很混乱,所以写下来是件好事......
【解决方案2】:

就像刚才提到的答案,这是一个副本和视图的问题。

如果我想这样做,我可以选择这个:

f['b'] = np.where(f['a'] <= 3, f['b']/10, f['b'])
#f

Out[26]:
a   b
0   1   1
1   2   2
2   3   3
3   4   40
4   5   50

【讨论】:

    猜你喜欢
    • 2015-11-21
    • 1970-01-01
    • 1970-01-01
    • 2013-06-19
    • 1970-01-01
    • 2020-09-30
    • 2021-07-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多