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

jan*_*kos 6 python arrays numpy pandas

我有以下数据框:

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

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

我需要添加什么:

pa.loc[:,['a']]
Run Code Online (Sandbox Code Playgroud)

b10*_*10n 11

pa.loc[row]选择带标签的行row.

pa.loc[row, col]选择它们是的instersection细胞rowcol

pa.loc[:, col]选择所有行和名为的列col.请注意,尽管这有效,但它并不是引用数据帧列的惯用方法.为此你应该使用pa['a']

现在,您在列的单元格中有列表,因此您可以使用向量化字符串方法来访问这些列表的元素.

pa['a'].str[0] #first value in lists
pa['a'].str[-1] #last value in lists
Run Code Online (Sandbox Code Playgroud)


unu*_*tbu 8

将列表存储为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
Run Code Online (Sandbox Code Playgroud)

现在,您可以选择第一列,如下所示:

In [36]: df.iloc[:, 0]
Out[36]: 
0    1.0
1    2.0
2    3.0
Name: 0, dtype: float64
Run Code Online (Sandbox Code Playgroud)

或者像这样的第一行:

In [37]: df.iloc[0, :]
Out[37]: 
0    1.0
1    4.0
2    NaN
Name: 0, dtype: float64
Run Code Online (Sandbox Code Playgroud)

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

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

并将.tolist()值检索为列表:

In [39]: df.iloc[0, :].dropna().tolist()
Out[39]: [1.0, 4.0]
Run Code Online (Sandbox Code Playgroud)

但是如果你想利用NumPy/Pandas来提高速度,你需要将计算表达为df自身的矢量化操作,而不必转换回Python列表.