我有兴趣知道如何将pandas数据帧转换为numpy数组,包括索引,并设置dtypes .
数据帧:
import numpy as np
import pandas as pd
index = [1, 2, 3, 4, 5, 6, 7]
a = [np.nan, np.nan, np.nan, 0.1, 0.1, 0.1, 0.1]
b = [0.2, np.nan, 0.2, 0.2, 0.2, np.nan, np.nan]
c = [np.nan, 0.5, 0.5, np.nan, 0.5, 0.5, np.nan]
df = pd.DataFrame({'A': a, 'B': b, 'C': c}, index=index)
df = df.rename_axis('ID')
给
label A B C
ID
1 NaN 0.2 NaN
2 NaN NaN 0.5
3 NaN 0.2 0.5
4 0.1 0.2 NaN
5 0.1 0.2 0.5
6 0.1 NaN 0.5
7 0.1 NaN NaN
将df转换为数组返回:
array([[ nan, 0.2, nan],
[ nan, nan, 0.5],
[ nan, 0.2, 0.5],
[ 0.1, 0.2, nan],
[ 0.1, 0.2, 0.5],
[ 0.1, nan, 0.5],
[ 0.1, nan, nan]])
但是,我想:
array([[ 1, nan, 0.2, nan],
[ 2, nan, nan, 0.5],
[ 3, nan, 0.2, 0.5],
[ 4, 0.1, 0.2, nan],
[ 5, 0.1, 0.2, 0.5],
[ 6, 0.1, nan, 0.5],
[ 7, 0.1, nan, nan]],
dtype=[('ID', '<i4'), ('A', '<f8'), ('B', '<f8'), ('B', '<f8')])
(或类似的)
有关如何实现这一目标的任何建议? (我不知道此时我是否需要1D或2D阵列 . )我已经看到了一些涉及这个的帖子,但没有专门处理dataframe.index .
我正在使用to_csv编写数据帧磁盘(并将其读回来创建数组)作为一种解决方法,但我更喜欢比我的新熊猫kludging更有说服力的东西 .
11 回答
要将pandas数据帧(df)转换为numpy ndarray,请使用以下代码:
df = df.values
df现在成为numpy ndarray:
熊猫有内置的东西......
给
我只是链接DataFrame.reset_index()和DataFrame.values函数来获取数据帧的Numpy表示,包括索引:
要获得dtypes,我们需要使用view将此ndarray转换为结构化数组:
从dataframe导出到arcgis表时遇到了类似的问题,偶然发现了usgs(https://my.usgs.gov/confluence/display/cdi/pandas.DataFrame+to+ArcGIS+Table)的解决方案 . 简而言之,您的问题有类似的解决方案:
您可以使用
to_records
方法,但如果它们不是您想要的,那么必须使用dtypes . 在我的例子中,从字符串复制DF后,索引类型是字符串(由pandas中的object
dtype表示):转换recarray dtype对我来说不起作用,但是已经可以在Pandas中执行此操作:
请注意,Pandas没有在导出的记录数组中正确设置索引的名称(到
ID
)(一个错误?),所以我们从类型转换中获益也是为了纠正它 .目前,Pandas只有8字节的整数,
i8
和浮点数,f8
(见这个issue) .好像
df.to_records()
会对你有用 . 您正在寻找的确切功能was requested和to_records
作为替代方案 .我在本地使用你的例子尝试了这个,并且该调用产生的东西与你正在寻找的输出非常相似:
请注意,这是
recarray
而不是array
. 您可以通过将其构造函数调用为np.array(df.to_records())
将结果移动到常规numpy数组中 .这是我从pandas DataFrame制作结构数组的方法 .
创建数据框
定义函数以从pandas DataFrame创建numpy结构数组(不是记录数组) .
使用
reset_index
创建一个新数据框,其中包含索引作为其数据的一部分 . 将该数据帧转换为结构数组 .编辑:更新了df_to_sarray以避免错误调用.encode()与python 3.感谢Joseph Garvin和halcyon的评论和解决方案 .
将数据帧转换为Numpy数组表示的两种方法 .
mah_np_array = df.as_matrix(columns=None)
mah_np_array = df.values
Doc:https://pandas.pydata.org/pandas-docs/stable/generated/pandas.DataFrame.as_matrix.html
继meteore的回答之后,我找到了代码
不适合我 . 所以我把我的代码放在这里是为了方便其他人坚持这个问题 .
示例DataFrame的简单方法:df
使用:
得到:
感谢Phil的回答,这很棒 .
回复
我使用python 3,并得到相同的错误 . 然后我删除.encode(),然后表达式如下 .
然后它工作 .