2016-01-17 62 views
0

我試圖從DataFrames中提取數據作爲單獨的NumPy數組傳遞給SciPy統計數據方法。Python:從DataFrame列中提取數組

實施例數據幀:

userId numCol 
147  1.3 
222  2.6 
389  5.7 
443  1.2 
222  2.4 
678  2.1 
443  1.8 
501  2.1 
147  1.2 
501  3.2 
678  1.3 
389  2.4 

對於6級唯一的用戶ID的,讓我們說我只要提取4個單獨的陣列用於numCol這些值的用戶標識的147,222,389和443。

輸出應該是這樣的:

數組名147:array([1.3, 1.2)]
數組名222:array([2.6, 2.4)]
數組名389:array([5.7, 2.4)]
數組名443:array([1.2, 1.8)]

我不知道是否最好的辦法是通過利用熊貓isin和NumPy的values數據框來爲用戶標識的我想要的,然後循環列表。

我已經仔細看過這個類似的question,它不一樣。

回答

1

你可以得到與某個特定userId相對應的行,如df[df.userId == 147]。所以,如果你有你想要的用戶id列表,你可以這樣做:

for userId in userIds_to_check: 
    stats.anderson(df[df.userId == userId].numCol) 

(或任何功能,你想打電話,而不是anderson)。請注意,通常你不需要得到一個普通的numpy數組;你可以在pandas系列上調用大多數統計功能,他們會工作得很好。如果你因爲某種原因想要一個普通的numpy數組,你可以做df[df.userId == userId].numCol.values

取決於你在做什麼,你可能希望只使用groupby,這樣可以讓你的函數只映射到每個用戶id組,是這樣的:

>>> df.groupby('userId').numCol.apply(stats.skew) 

userId 
147 0.000000e+00 
222 0.000000e+00 
389 3.954380e-16 
443 0.000000e+00 
501 -1.251190e-15 
678 -8.673617e-16 
Name: numCol, dtype: float64 

在這裏,我計算的偏態通過將stats.skew應用於每個羣組,每個用戶ID的numCol值一舉一舉。

+0

明智的答案,學到這麼多!你會介意只是添加如何提取單個數組,因爲我希望有靈活性取決於我在做什麼。謝謝。 – RDJ

+1

@Jonathan:單個數組是'df [df.userId == blah] .numCol',其中'blah'是任何你想要的值的userId。 – BrenBarn

+0

再次感謝 - 但最初的想法是通過迭代過程來提取單個數組,而不是一次只提取一個數組。對不起,有任何困惑。 – RDJ