2016-03-10 90 views
2

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

 
    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  NaN 
4  2 214662742  5 41.759 
5  2 214662742  5 78.073 
6  3 214576500  6  NaN 
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 
+0

'[j [j] .index] .index'不是有效的语法.. – karthikr

+1

如果您要提供一个样本输入数据作为文本 – MaxU

+0

@MaxU,将会有帮助添加样本数据集 –

回答

2

这是你会怎么做赋值:

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 

变换回报系列相同长度的数据帧。然后找到找到那些等于1的数据,并使用loc将那些索引位置处的列td设置为零值。

+0

你可以简化一点:'k.ix [(k.groupby('Block')。Sid.transform('count')== 1),'td'] = 0 ' – MaxU

+0

总是喜欢简化。谢谢。 – Alexander

+0

@亚历山大:完美。正是我想要的。谢谢。我试图在这里了解转换函数。我最初感到困惑,因为groupby会返回一个较小的数据帧,而初始数据帧k很大。在运行代码时,我发现变换将组中的所有成员应用给定的参数(count)。如我错了请纠正我。 –