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
。
DataFrame
转ndarray
定义一个DataFrame
类型数据,可以使用loc
或者iloc
对Dataframe
进行简单的加工。
测试数据集
范例代码如下:
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) )
print(df2,type(df2))
print(df3,type(df3))
输出:
name age category
0 虎子 5 dog
1 老许 3 dog
2 二赖子 6 dog
3 老白 8 cat
4 小黑 10 cat
<class 'pandas.core.frame.DataFrame'>
name age category
0 虎子 5 dog
1 老许 3 dog
<class 'pandas.core.frame.DataFrame'>
0 dog
1 dog
2 dog
3 cat
4 cat
Name: category, dtype: object
<class 'pandas.core.series.Series'>
DataFrame
的某一列数据,类型是Series
。
参考苏南大叔的文章:
两种转换方法
有两种方式可以实现DataFrame
到ndarray
的转化,这两种方法是:
df.values
numpy.array(df)
测试代码:
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
类型数据,可以利用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))
print(x2,type(x2))
print(x3,type(x3))
输出:
[[ 0 1]
[ 2 3]
[ 4 5]
[ 6 7]
[ 8 9]
[10 11]]
<class 'numpy.ndarray'>
[[ 0 1 2 3]
[ 4 5 6 7]
[ 8 9 10 11]]
<class 'numpy.ndarray'>
[[ 0]
[ 1]
[ 2]
[ 3]
[ 4]
[ 5]
[ 6]
[ 7]
[ 8]
[ 9]
[10]
[11]]
<class 'numpy.ndarray'>
这个reshape()
操作非常有用,如果把ndarray
想象成一个矩形的话,那么,reshape()
操作就赋予了其任意变形的能力。
参考苏南大叔的文章:
转化方法
ndarray
转为DataFrame
的方式,目前有下面一种方式:
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
的概念。
总结
更多经验文章,可以参考苏南大叔的python
系列文章:


