熊猫数据框到一维数组

时间:2018-07-15 23:11:17

标签: python pandas numpy

我有一个包含很多列的数据框。

我首先从数据框中仅选择一列 r_i = df.iloc[:, i: i + 1]

然后我想简单地通过以下方式将此r_i转换为数组 np.array(r_i)

我想要的结果是: array([-1, -2, -3])。换句话说,它应该是一个列表的数组。

但是,它为我提供了一个包含子列表的列表的数组: array([[-1], [-2], [-3]])

如何防止这种情况发生?

谢谢。

2 个答案:

答案 0 :(得分:2)

因此,鉴于:

>>> df = pd.DataFrame({'a':[1,2,3,4], 'b':[5,6,7,8], 'c':[9,10,11,12]})
>>> i = 1
>>> df
   a  b   c
0  1  5   9
1  2  6  10
2  3  7  11
3  4  8  12
>>> df.iloc[:, i: i + 1]
   b
0  5
1  6
2  7
3  8
>>> np.array(df.iloc[:, i: i + 1])
array([[5],
       [6],
       [7],
       [8]])

您可以使用.squeeze方法,该方法从数组中删除一个维:

>>> np.array(df.iloc[:, i: i + 1]).squeeze()
array([5, 6, 7, 8])

尽管我可能只使用:

>>> df.iloc[:, i: i + 1].values.squeeze()
array([5, 6, 7, 8])

或者,您始终可以使用.reshape,这是您想整形一个数组时的第一个本能:

>>> np.array(df.iloc[:, i: i + 1]).reshape(-1)
array([5, 6, 7, 8])

请注意,如果您不小心增加了额外的一列,这些行为会有所不同,所以:

>>> np.array(df.iloc[:, i: i + 2])
array([[ 5,  9],
       [ 6, 10],
       [ 7, 11],
       [ 8, 12]])

重塑:

>>> np.array(df.iloc[:, i: i + 2]).reshape(-1)
array([ 5,  9,  6, 10,  7, 11,  8, 12])

挤压:

>>> np.array(df.iloc[:, i: i + 2]).squeeze()
array([[ 5,  9],
       [ 6, 10],
       [ 7, 11],
       [ 8, 12]])

理想情况下,您可能只想让它失败,因此,如果要进行防御性编程,请使用带有显式参数的reshape而不是-1

>>> np.array(df.iloc[:, i: i + 1]).reshape((df.shape[0],))
array([5, 6, 7, 8])
>>> np.array(df.iloc[:, i: i + 2]).reshape((df.shape[0],))
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ValueError: cannot reshape array of size 8 into shape (4,)
>>>

但是

您可以通过不做不必要的切片来避免这种情况,所以:

>>> df.iloc[:, i: i + 1]
   b
0  5
1  6
2  7
3  8
>>> df.iloc[:, i + 1]
0     9
1    10
2    11
3    12
Name: c, dtype: int64

后者为您提供了系列,该系列已经是一维的,因此您可以使用:

>>> df.iloc[:, i + 1].values
array([ 9, 10, 11, 12])

答案 1 :(得分:1)

df.values.flatten()

在这里,df是您的DataFrame。