使用 pandas 读取带有 numpy 数组的 csv
Posted
技术标签:
【中文标题】使用 pandas 读取带有 numpy 数组的 csv【英文标题】:Read a csv with numpy array using pandas 【发布时间】:2015-09-04 23:42:47 【问题描述】:我有一个包含 3 列 emotion, pixels, Usage
的 csv
文件,其中包含 35000
行,例如0,70 23 45 178 455,Training
。
我使用pandas.read_csv
将csv
文件读取为pd.read_csv(filename, dtype='emotion':np.int32, 'pixels':np.int32, 'Usage':str)
。
当我尝试上述操作时,它显示ValueError: invalid literal for long() with base 10: '70 23 45 178 455'
?如何将像素列读取为numpy
数组?
【问题讨论】:
【参考方案1】:请尝试以下代码 -
df = pd.read_csv(filename, dtype='emotion':np.int32, 'pixels':str, 'Usage':str)
def makeArray(text):
return np.fromstring(text,sep=' ')
df['pixels'] = df['pixels'].apply(makeArray)
【讨论】:
您好,感谢您的帮助。现在显示TypeError: data type not understood
。可能的错误是什么?【参考方案2】:
我相信使用矢量化的str
方法会更快地拆分字符串并根据需要创建新的像素列,并concat
将新列添加到新的df:
In [175]:
# load the data
import pandas as pd
import io
t="""emotion,pixels,Usage
0,70 23 45 178 455,Training"""
df = pd.read_csv(io.StringIO(t))
df
Out[175]:
emotion pixels Usage
0 0 70 23 45 178 455 Training
In [177]:
# now split the string and concat column-wise with the orig df
df = pd.concat([df, df['pixels'].str.split(expand=True).astype(int)], axis=1)
df
Out[177]:
emotion pixels Usage 0 1 2 3 4
0 0 70 23 45 178 455 Training 70 23 45 178 455
如果你特别想要一个扁平的 np 数组,你可以调用 .values
属性:
In [181]:
df['pixels'].str.split(expand=True).astype(int).values
Out[181]:
array([[ 70, 23, 45, 178, 455]])
【讨论】:
【参考方案3】:我遇到了同样的问题并想出了一个技巧。将您的数据帧保存为.npy
文件。在加载它时,它将作为ndarray
加载。您可以使用 pandas.DataFrame
将 ndarray 转换为数据框供您使用。我发现这个解决方案比从字符串字段转换更容易。示例代码如下:
import numpy as np
import pandas as pd
np.save('file_name.npy',dataframe_to_be_saved)
#the dataframe is saved in 'file_name.npy' in your current working directory
#loading the saved file into an ndarray
arr=np.load('file_name.npy')
df=pd.DataFrame(data=arr[:,1:],index=arr[:,0],columns=column_names)
#df variable now stores your dataframe with the original datatypes
【讨论】:
以上是关于使用 pandas 读取带有 numpy 数组的 csv的主要内容,如果未能解决你的问题,请参考以下文章
从带有描述的 Numpy nd 数组创建 Pandas DataFrame 的更快方法?