2014-09-26 91 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