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细胞row和col
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)
将列表存储为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列表.