python,如何实现DataFrame和ndarray的类型互转?
发布于 作者:苏南大叔 来源:程序如此灵动~ 我们相信:世界是美好的,你是我也是。平行空间的世界里面,不同版本的生活也在继续...
在机器学习领域,基于pandans
的dataframe
数据类型、基于numpy
的ndarray
数据类型,都是非常常见的。处理各种原始数据的时候,经常会碰到。那么,不可避免的会碰到两者做类型互转的情况。那么,本文中,将基于python
编程语言,对DataFrame
类型和ndarray
类型做互转的方法,做简要的说明。
大家好,这里是苏南大叔的“程序如此灵动”博客,记录苏南大叔和计算机代码的故事。在机器学习的数据处理阶段,最常见的DataFrame
类型和ndarray
类型的互转方法,在这里将要被描述。测试环境:win10
,python@3.11.0
,numpy@1.24.2
,pandas@1.5.3
。
写在最前面的是:本文中的ndarray
是个二维数组,二维的,维度是2。虽然存在其它维度的ndarray
,但是并不适合本文。
DataFrame
转ndarray
有两种方式可以实现DataFrame
到ndarray
的转化,这两种方法是:
df.values
numpy.array(df)
测试代码
定义一个DataFrame
类型数据,可以使用loc
或者iloc
对Dataframe
进行简单的加工。
DataFrame
的某一列数据,类型是Series
。
参考苏南大叔的文章:
import pandas as pd
from pandas import Series, DataFrame
df = DataFrame({
'name':[
'虎子',
'老许',
'二赖子',
'老白',
'小黑',
],
'age':[5,3,6,8,10],
'category':["dog","dog","dog","cat","cat"]
})
df2 = df.iloc[0:2][:] # 前两行行数据
df3 = df.loc[:]["category"] # 最后一列数据
print(df ,type(df) ) # <class 'pandas.core.frame.DataFrame'>
print(df2,type(df2)) # <class 'pandas.core.frame.DataFrame'>
print(df3,type(df3)) # <class 'pandas.core.series.Series'>
import numpy as np
_np = df.values
_np2 = df2.values
_np3 = df3.values
print(_np ,type(_np))
print(_np2,type(_np2))
print(_np3,type(_np3))
_np = np.array(df)
_np2 = np.array(df2)
_np3 = np.array(df3)
print(_np ,type(_np))
print(_np2,type(_np2))
print(_np3,type(_np3))
输出:
[['虎子' 5 'dog']
['老许' 3 'dog']
['二赖子' 6 'dog']
['老白' 8 'cat']
['小黑' 10 'cat']]
<class 'numpy.ndarray'>
[['虎子' 5 'dog']
['老许' 3 'dog']]
<class 'numpy.ndarray'>
['dog' 'dog' 'dog' 'cat' 'cat']
<class 'numpy.ndarray'>
[['虎子' 5 'dog']
['老许' 3 'dog']
['二赖子' 6 'dog']
['老白' 8 'cat']
['小黑' 10 'cat']]
<class 'numpy.ndarray'>
[['虎子' 5 'dog']
['老许' 3 'dog']]
<class 'numpy.ndarray'>
['dog' 'dog' 'dog' 'cat' 'cat']
<class 'numpy.ndarray'>
ndarray
转DataFrame
ndarray
转为DataFrame
的方式,目前有下面一种方式:
pd.DataFrame(x)
测试代码
再定义一个ndarray
类型数据,可以利用reshape
对数据进行简单的再加工。参考苏南大叔的文章:
import numpy as np
x = np.array([[0,1],[2,3],[4,5],[6,7],[8,9],[10,11]])
x2 = x.reshape((3,4))
x3 = x.reshape((12,1))
print(x,type(x)) # <class 'numpy.ndarray'>
print(x2,type(x2)) # <class 'numpy.ndarray'>
print(x3,type(x3)) # <class 'numpy.ndarray'>
这个reshape()
操作非常有用,如果把ndarray
想象成一个矩形的话,那么,reshape()
操作就赋予了其任意变形的能力。
import pandas as pd
df = pd.DataFrame(x)
df2 = pd.DataFrame(x2)
df3 = pd.DataFrame(x3)
print(df,type(df))
print(df2,type(df2))
print(df3,type(df3))
输出:
0 1
0 0 1
1 2 3
2 4 5
3 6 7
4 8 9
5 10 11
<class 'pandas.core.frame.DataFrame'>
0 1 2 3
0 0 1 2 3
1 4 5 6 7
2 8 9 10 11
<class 'pandas.core.frame.DataFrame'>
0
0 0
1 1
2 2
3 3
4 4
5 5
6 6
7 7
8 8
9 9
10 10
11 11
<class 'pandas.core.frame.DataFrame'>
这里有个很有意思的现象,DataFrame
的一列数据,取出来叫做series
类型。但是ndarray
的一列数据,转换过去之后,依然是DataFrame
类型。
题外话,两种数据类型区别
关于ndarray
这个类型的拼写,这里做个简要的对比,见下图:
拼写方面来说,np
+.array
=>ndarray
,而不是nparray
。
苏南大叔个人理解着,ndarray
和dataframe
的主要区别就是:
dataframe
有行号和列号(表头)。ndarray
并没有这个表头索引,但是有个shape
的概念。
想象一下,ndarray
和dataframe
的区别,就类似于csv
和xls
的区别。普通的类型就是ndarray
,加工后的类型就是dataframe
。不知道,大家是否同意苏南大叔的观点。
总结
其实,DataFrame和ndarray的相互转化的最简单的方法,就是强制类型转换!哈哈哈!
numpy.array(df)
pd.DataFrame(x)
更多经验文章,可以参考苏南大叔的python
系列文章:
如果本文对您有帮助,或者节约了您的时间,欢迎打赏瓶饮料,建立下友谊关系。
本博客不欢迎:各种镜像采集行为。请尊重原创文章内容,转载请保留作者链接。
本博客不欢迎:各种镜像采集行为。请尊重原创文章内容,转载请保留作者链接。