2014-09-26 124 views
5

選擇元件I具有以下的數據幀:Python的熊貓:在陣列列

pa=pd.DataFrame({'a':np.array([[1.,4.],[2.],[3.,4.,5.]])}) 

我想選擇的列「A」,然後僅一個特定的元素(即,第一:1.,2。 3)

什麼我需要添加到:

pa.loc[:,['a']] 

回答

9

pa.loc[row]選擇標籤爲row的行。

pa.loc[row, col]選擇它們是row的instersection和col

pa.loc[:, col]選擇所有行和命名col列的單元格。請注意,雖然這起作用,但它並不是引用數據幀列的慣用方式。爲此,您應該使用pa['a']

現在,您的列中的單元格中有列表,因此您可以使用vectorized string methods來訪問這些列表中的元素,如下所示。

pa['a'].str[0] #first value in lists 
pa['a'].str[-1] #last value in lists 
+0

謝謝。很好的解決方案 – jankos 2014-09-27 06:02:28

4

存儲在大熊貓表的單個列中的NumPy的陣列的行往往是錯誤的,因爲這樣做任何與這種形式的數據是有用的尷尬。

這裏有兩種方式來獲得在所需的數據,這兩者都不是很漂亮:

import numpy as np 
import pandas as pd 
import operator 

pa = pd.DataFrame({'a':np.array([[1.,4.],[2.],[3.,4.,5.]])}) 
print(pa['a'].map(operator.itemgetter(0))) 
# 0 1 
# 1 2 
# 2 3 
# Name: a, dtype: float64 

或者你可以只用一個列表理解:

print([item[0] for item in pa['a']]) 
# [1.0, 2.0, 3.0] 

,這第二個方法看起來如此簡單可能表明列表列表可能是一個更合適的數據結構。


如果你想使用熊貓表,它可能會更好每個值存儲在自己的列:

0 1 2 
0 1 4 NaN 
1 2 NaN NaN 
2 3 4 5 

這可能需要更多的內存,但現在的數據是在形式可能更有用。

您可以將數據幀轉換爲這個新的一個是這樣的:

In [314]: pa = pa['a'].apply(lambda row: pd.Series(row)); pa 
Out[314]: 
    0 1 2 
0 1 4 NaN 
1 2 NaN NaN 
2 3 4 5 

而且現在選擇從各行的第一個值很簡單:

In [315]: pa[0] 
Out[315]: 
0 1 
1 2 
2 3 
Name: 0, dtype: float64 

它也比其它選項快得多:

In [5]: pa2 = pa['a'].apply(lambda row: pd.Series(row)) 

In [6]: %timeit pa2[0] 
100000 loops, best of 3: 1.95 µs per loop 

In [10]: %timeit [item[0] for item in pa['a']] 
100000 loops, best of 3: 14.4 µs per loop 

In [9]: %timeit pa['a'].map(operator.itemgetter(0)) 
10000 loops, best of 3: 44 µs per loop 

In [13]: %timeit pa['a'].str[0] 
10000 loops, best of 3: 67.2 µs per loop 
+0

這是一個非常好的答案。不知道爲什麼沒有人贊成呢! – Aaron 2016-02-17 01:23:35