【问题标题】:Indexing Error in PandasPandas 中的索引错误
【发布时间】:2016-06-25 21:06:28
【问题描述】:

我无法找出索引中的错误。我相信这一定是一个愚蠢的错误。我想将这些行的“td”值设置为 0,其“块”大小为 1。我首先找出这些行,然后使用这些索引将“td”列的值设置为 0。 这是样本数据集。这里除了第5、7、8号区块外,所有其他区块的值都应该在'td'列中设置为0。

Sid Itemid Block td 0 1 214536502 1 180.591 1 1 214536500 2 37.13 2 1 214536506 3 133.308 3 1 214577561 4 南 4 2 214662742 5 41.759 5 2 214662742 5 78.073 6 3 214576500 6 南 7 4 214821275 7 26.002 8 4 214821275 7 28.199 9 5 214821371 8 42.289 10 5 214821371 8 45.193

这是我的代码。我得到了意想不到的输出。

j=k.groupby('Block').Sid.count()==1
te=k['Block'][j[j].index].index
k['td'][te]=0

预期输出-

Sid Itemid Block td 0 1 214536502 1 0 1 1 214536500 2 0 2 1 214536506 3 0 3 1 214577561 4 0 4 2 214662742 5 41.759 5 2 214662742 5 78.073 6 3 214576500 6 0 7 4 214821275 7 26.002 8 4 214821275 7 28.199 9 5 214821371 8 42.289 10 5 214821371 8 45.193

【问题讨论】:

  • [j[j].index].index 语法无效..
  • 如果您能以文本形式提供示例输入数据会很有帮助
  • @MaxU 添加了示例数据集
  • 预期输出是什么?
  • 你的意思是“谁的块大小”或“谁的块数”是1?

标签: python pandas data-science


【解决方案1】:

这就是你做任务的方式:

k.ix[(k.groupby('Block').Sid.transform('count') == 1), 'td'] = 0

>>> k
    Sid     Itemid  Block      td
0     1  214536502      1   0.000
1     1  214536500      2   0.000
2     1  214536506      3   0.000
3     1  214577561      4   0.000
4     2  214662742      5  41.759
5     2  214662742      5  78.073
6     3  214576500      6   0.000
7     4  214821275      7  26.002
8     4  214821275      7  28.199
9     5  214821371      8  42.289
10    5  214821371      8  45.193

Transform 返回与数据帧长度相同的序列。然后 find 找到等于 1 的那些,并使用 loc 将这些索引位置处的列 td 设置为零。

【讨论】:

  • 你可以稍微简化一下:k.ix[(k.groupby('Block').Sid.transform('count') == 1), 'td'] = 0
  • 总是喜欢简化。谢谢。
  • @Alexander:完美。正是我想要的。谢谢你。我想在这里理解变换功能。我最初很困惑,因为 groupby 将返回一个较小的数据帧,而初始数据帧 k 很大。在运行代码时,我发现转换将给定的参数(计数)应用于组的所有成员。如果我错了,请纠正我。
  • 你是对的。正如我在上面的描述中所指出的,transform 返回一个与原始数据帧长度相同的序列。
猜你喜欢
  • 2020-09-16
  • 1970-01-01
  • 2018-12-28
  • 2021-09-20
  • 2017-06-09
  • 2018-02-07
  • 1970-01-01
  • 2019-11-16
  • 1970-01-01
相关资源
最近更新 更多