2016-12-02 56 views
0

我有一個關於熊貓的一般性問題。我有一個名爲d的DataFrame,其中有很多關於公園的信息。所有獨特的公園名稱都存儲在名爲parks的數組中。還有另一列有位置ID,我想遍歷公園陣列並打印與該公園名稱關聯的唯一位置ID計數。存儲分組數據與變量

d[d['Park']=='AKRO'] 
len(d['Location'].unique()) 

給我的24824.

x = d[d['Park']=='AKRO'] 
print(len(x['Location'].unique())) 

計數給我的1。爲什麼一個位置計數?我認爲這些都是一樣的,除了我將信息存儲在變量中。

所以很自然,我試圖循環不起作用。有沒有人有任何提示?

counts=[] 
for p in parks: 
    x= d[d['Park']==p] 
    y= (len(x['Location'].unique())) 
    counts.append([p,y]) 

回答

1

當您第一次進行子集化時,您不會將d[d['Park'] == 'ARKO']分配給任何東西。所以你並沒有真正改變數據。您只能查看該部分數據。

當您指定x = d[d['Park']=='AKRO']時,x現在只是您使用第一個命令查看的那個部分。這就是爲什麼你得到你觀察到的差異。

您的for循環實際上只循環使用d的列。如果你想遍歷行,你可以使用下面的代碼。

for idx, row in d.iterrows(): 
    print(idx, row) 

但是,如果要使用for循環來計算位置數,則必須遍歷每個公園。像下面這樣。

for park in d['Park'].unique(): 
    print(park, d.loc[d['Park'] == park, 'Location'].size()) 

但是,您可以在不迭代的情況下完成目標。這種方法是優選的。

d.groupby('Park')['Location'].nunique() 
1

你可以嘗試像,

d.groupby('Park')['Location'].nunique() 
1

小心熊貓的數據幀功能,其生成行內變化與否。例如,d[d['Park']=='AKRO']實際上不會更改DataFrame d。但是,x = d[d['Park']=='AKRO']d[d['Park']=='AKRO']的輸出設置爲x,因此x現在只有1個位置。

您是否已手動檢查「AKRO」有多少個唯一的位置ID? for循環在額外括號外面正確的看起來是正確的y= len(x['Location'].unique())