我有以下数据框:
pa=pd.DataFrame({'a':np.array([[1.,4.],[2.],[3.,4.,5.]])})
我想选择列'a'然后只选择一个特定的元素(即第一个:1.,2.,3。)
我需要添加什么:
pa.loc[:,['a']]
答案 0 :(得分:11)
pa.loc[row]
选择标记为row
的行。
pa.loc[row, col]
选择对row
和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
答案 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列表。