3

ここでインデックス作成の間違いを見つけることができません。これはばかげた間違いに違いないと確信しています。「ブロック」サイズが 1 の行の「td」値を 0 に設定したいです。最初にそのような行を見つけてから、それらのインデックスを使用して列「td」の値を 0 に設定します。サンプルデータセット。ここで、ブロック番号 5、7、8 を除いて、他のすべてのブロック値は「td」列で 0 に設定する必要があります。

    Sid Itemid ブロック 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 ブロック 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
4

1 に答える 1

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

Transform は、データフレームと同じ長さのシリーズを返します。次に、find を使用して 1 に等しいものを見つけ、それらのインデックス位置locの列を値 0 に設定するために使用します。td

于 2016-03-10T20:29:29.810 に答える