2016-03-10 49 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)。如我錯了請糾正我。 –