Python Pandas:在数组列中选择元素

时间:2014-09-26 22:33:30

标签: python arrays numpy pandas

我有以下数据框:

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

我想选择列'a'然后只选择一个特定的元素(即第一个:1.,2.,3。)

我需要添加什么:

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

2 个答案:

答案 0 :(得分:11)

pa.loc[row]选择标记为row的行。

pa.loc[row, col]选择对rowcol

进行检测的单元格

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

答案 1 :(得分:7)

将列表存储为Pandas DataFrame中的值往往是一个错误,因为 它会阻止您利用快速NumPy或Pandas矢量化操作。

因此,您可能最好将数据列表的DataFrame转换为具有原生NumPy dtypes的更宽的DataFrame:

import numpy as np
import pandas as pd

pa = pd.DataFrame({'a':np.array([[1.,4.],[2.],[3.,4.,5.]])})
df = pd.DataFrame(pa['a'].values.tolist())
#      0    1    2
# 0  1.0  4.0  NaN
# 1  2.0  NaN  NaN
# 2  3.0  4.0  5.0

现在,您可以像这样选择第一列:

In [36]: df.iloc[:, 0]
Out[36]: 
0    1.0
1    2.0
2    3.0
Name: 0, dtype: float64

或第一行如下:

In [37]: df.iloc[0, :]
Out[37]: 
0    1.0
1    4.0
2    NaN
Name: 0, dtype: float64

如果您想放弃NaN,请使用.dropna()

In [38]: df.iloc[0, :].dropna()
Out[38]: 
0    1.0
1    4.0
Name: 0, dtype: float64

.tolist()以列表形式检索值:

In [39]: df.iloc[0, :].dropna().tolist()
Out[39]: [1.0, 4.0]

但是如果您希望利用NumPy / Pandas来提高速度,那么您希望将计算表达为df本身的矢量化操作,而无需转换回Python列表。