我有一个包含很多列的数据框。
我首先从数据框中仅选择一列
r_i = df.iloc[:, i: i + 1]
然后我想简单地通过以下方式将此r_i
转换为数组
np.array(r_i)
。
我想要的结果是:
array([-1, -2, -3])
。换句话说,它应该是一个列表的数组。
但是,它为我提供了一个包含子列表的列表的数组:
array([[-1], [-2], [-3]])
。
如何防止这种情况发生?
谢谢。
答案 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。