从熊猫数据框创建numpy数组[重复]

Posted

技术标签:

【中文标题】从熊猫数据框创建numpy数组[重复]【英文标题】:Creating numpy array from pandas dataframe [duplicate] 【发布时间】:2017-12-01 05:12:59 【问题描述】:
import pandas as pd
import numpy as np
df = pd.read_csv('~/test.txt')
list(df.columns.values)

我得到以下输出:

['time', 'Res_fs1', 'angle1', 'Res_fs2', 'angle2', 'Res_ps1', 'Force1', 
'Res_ps2', 'Force2', 'object']

当我尝试使用 Res_fs1、Res_fs2、Res_ps1、Res_ps2 创建一个 numpy 数组时

X=np.array(df['Res_fs1','Res_fs2','Res_ps1','Res_ps2'])

虽然密钥存在,但我收到此错误消息说密钥错误:

Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/usr/lib/python2.7/dist-packages/pandas/core/frame.py", line 1969, in 
__getitem__
return self._getitem_column(key)
File "/usr/lib/python2.7/dist-packages/pandas/core/frame.py", line 1976, in 
_getitem_column
return self._get_item_cache(key)
File "/usr/lib/python2.7/dist-packages/pandas/core/generic.py", line 1091, 
in _get_item_cache
values = self._data.get(item)
File "/usr/lib/python2.7/dist-packages/pandas/core/internals.py", line 3211, 
in get
loc = self.items.get_loc(item)
File "/usr/lib/python2.7/dist-packages/pandas/core/index.py", line 1759, in 
get_loc
return self._engine.get_loc(key)
File "pandas/index.pyx", line 137, in pandas.index.IndexEngine.get_loc 
(pandas/index.c:3979)
File "pandas/index.pyx", line 157, in pandas.index.IndexEngine.get_loc 
(pandas/index.c:3843)
File "pandas/hashtable.pyx", line 668, in 
pandas.hashtable.PyObjectHashTable.get_item (pandas/hashtable.c:12265)
File "pandas/hashtable.pyx", line 676, in 
pandas.hashtable.PyObjectHashTable.get_item (pandas/hashtable.c:12216)
KeyError: ('Res_fs1', 'Res_fs2', 'Res_ps1', 'Res_ps2')

【问题讨论】:

【参考方案1】:

你可以这样做:

X = df[['Res_fs1','Res_fs2','Res_ps1','Res_ps2']].values

当你对列进行子集化时,你需要使用双方括号'[['和']]'

【讨论】:

更具体地说,外括号是 getitem 方法的语法糖,它需要一个参数。如果没有内括号,您将向该方法传递许多参数。使用内括号,您将传递一个知道如何处理的列表 如果没有括号,__getitem__ 特殊方法不会传递很多参数。相反,它传递了一个元组。查看关键错误【参考方案2】:

要真正了解发生了什么,您需要了解 Python 如何处理索引运算符(方括号)。在内部,方括号是调用对象的__getitem__ 特殊方法的特殊语法。如果对象没有实现特殊方法,你会得到一个对象不支持索引的错误。

当您调用df['Res_fs1','Res_fs2','Res_ps1','Res_ps2'] 时,Python 会将逗号分隔的列解释为一个元组。它将元组发送到 DataFrame 的 __getitem__ 特殊方法。

在内部,这就是所谓的。

df.__getitem__(('Res_fs1','Res_fs2','Res_ps1','Res_ps2'))

元组是不可变的对象,可以进行散列处理,因此是索引成员的候选对象。 pandas 尝试查找与元组 ('Res_fs1','Res_fs2','Res_ps1','Res_ps2') 完全相同的列名。由于您的 DataFrame 没有此列,因此引发了 KeyError

当您调用df[['Res_fs1','Res_fs2','Res_ps1','Res_ps2']] 时,__getitem__ 特殊方法会传递一个列表。列表不能被散列,因此不能成为索引的成员。因此,pandas 采用完全不同的路径并检索传递列表中的所有列名。如果列表中的一项不是列名,它将引发KeyError

【讨论】:

【参考方案3】:

pandas 有一个为此目的的内置函数:pandas.DataFrame.as_matrix

DataFrame.as_matrix(columns=None)

将帧转换为其 Numpy 数组表示。

【讨论】:

以上是关于从熊猫数据框创建numpy数组[重复]的主要内容,如果未能解决你的问题,请参考以下文章

从箭头格式到熊猫数据框的转换是不是会在堆上重复数据?

如何将熊猫单列数据框转换为系列或numpy向量[重复]

如何从一系列数组构造熊猫数据框

3维numpy数组到多索引熊猫数据框

将熊猫数据框保存到csv时如何保留numpy数组

将熊猫数据框保存到csv时如何保留numpy数组