Dataframe其实是一个表格型的数据结构,包含一组有序的列,可以理解为一个二维数组。
Dataframe中的数据以一个或多个二维数组块进行存放的,与列表、字典或一维数组的结构不同。其值类型可以是数值、字符串、布尔值等。
一、Pandas-Dataframe的概念和创建
1、Dataframe 简单介绍
Dataframe 是一个带有index(行标签)和columns(列标签)的表格型的数据结构。我的理解就是“带有标签的二维数组”。
import numpy as np
import pandas as pd
# 定义一个字典
data = {
'名字':['张三','李四','王五'],
'年龄':[28,29,30],
'性别':['女','男','女']}
# 将字典转换成dataframe
frame = pd.DataFrame(data)
print(frame)
# 类型是pandas.core.frame.DataFrame。
# RangeIndex(start=0, stop=3, step=1)的意思是标签从0开始到3结束(不含3),步长是1.
print(type(frame))
print('---------------------------------------')
# frame.index不会直接显示行标签的具体数值,而是RangeIndex(start=0, stop=3, step=1) 形式来展示。
print('这是行标签:\n',frame.index,'\n该数据类型为:',type(frame.index))
print('---------------------------------------')
print('这是列标签:\n',frame.columns,'\n该数据类型为:',type(frame.columns))
print('---------------------------------------')
# type(frame.values)显示的类型是'numpy.ndarray',就是一个二维数组。
print('这是值:\n',frame.values,'\n该数据类型为:',type(frame.values))
print('---------------------------------------')
print('显示值是维度:\n',frame.values.ndim)
运行结果如下:
名字 年龄 性别
0 张三 28 女
1 李四 29 男
2 王五 30 女
<class 'pandas.core.frame.DataFrame'>
---------------------------------------
这是行标签:
RangeIndex(start=0, stop=3, step=1)
该数据类型为: <class 'pandas.core.indexes.range.RangeIndex'>
---------------------------------------
这是列标签:
Index(['名字', '年龄', '性别'], dtype='object')
该数据类型为: <class 'pandas.core.indexes.base.Index'>
---------------------------------------
这是值:
[['张三' 28 '女']
['李四' 29 '男']
['王五' 30 '女']]
该数据类型为: <class 'numpy.ndarray'>
---------------------------------------
显示值是维度:
2
2、 Dataframe的创建方法一
通过pandas.Dataframe(),并由数组/list组成的字典进行创建。
通过字典创建的话,Dataframe的columns就是字典key,index为默认数字标签。
字典的值的长度必须保持一致。
# 定义由list组成字典
data1 = {
'a':[1,2,3],
'b':[3,4,5],
'c':[5,6,7]}
# 定义由数组组成字典方式:
#
data2 = {
'one':np.random.rand(3),
'two':np.random.rand(3)}
print(data1)
print('---------------------')
print(data2)
print('---------------------')
# 通过DataFrame方式创建
df1 = pd.DataFrame(data1)
df2 = pd.DataFrame(data2)
print(df1)
print('---------------------')
print(df2)
print('---------------------')
# 通过index参数改变标签,格式为list。长度必须保持一致
# 如果不一致的话会报错,可以试试下面这两句。
#df3 = pd.DataFrame(data1 ,index = ['W','X','Y','Z'])
#df3 = pd.DataFrame(data1 ,index = ['W','X'])
df3 = pd.DataFrame(data1 ,index = ['X','Y','Z'])
print(df3)
print('---------------------')
# 通过columns参数可以改变列的顺序,格式为list。
# 注意:说的是改变顺序!!!!!!
# 如果通过columns改变列的顺序,列的数量可以多余或者少于原数据。
# 如果多余的话则产生NaN值
# 原来的a b c,通过columns改变顺序 b c a,而且还多了一个d。
df4 = pd.DataFrame(data1, columns = ['b','c','a','d'])
print('注意改变顺序,并且d列全部是NaN:\n', df4)
print('---------------------')
# 原来的a b c,通过columns改变顺序 b c,而且还少了一个。
df5 = pd.DataFrame(data1, columns = ['b','c'])
print('注意改变顺序,并且a列已经不显示了:\n',df5)
print('---------------------')
运行结果如下:
{
'a': [1, 2, 3], 'b': [3, 4, 5], 'c': [5, 6, 7]}
---------------------
{
'one': array([0.66603783, 0.118737 , 0.5021944 ]), 'two': array([0.56441548, 0.6749825 , 0.17252099])}
---------------------
a b c
0 1 3 5
1 2 4 6
2 3 5 7
---------------------
one two
0 0.666038 0.564415
1 0.118737 0.674983
2 0.502194 0.172521
---------------------
a b c
X 1 3 5
Y 2 4 6
Z 3 5 7
---------------------
注意改变顺序,并且d列全部是NaN:
b c a d
0 3 5 1 NaN
1 4 6 2 NaN
2 5 7 3 NaN
---------------------
注意改变顺序,并且a列已经不显示了:
b c
0 3 5
1 4 6
2 5 7
---------------------
3、 Dataframe 创建方法二
通过Series组成的字典创建Dataframe,因为Series本身就带index所以在长度不一致的情况下,会生成NaN值。
由Seris组成的字典创建时,Dataframe的columns为字典key,index为Series的标签。
如果Series没有指定标签,则是默认数字标签
# 没有设置index的Series.
data1 = {
'A':pd.Series(np.random.rand(2)),
'B':pd.Series(np.random.rand(3))}
# 设置了index的Series
data2 = {
'C':pd.Series(np.random.rand(2), index = ['a','b']),
'D':pd.Series(np.random.rand(3),index = ['a','b','c'])}
# 设置index的时候,index写的都不一致。
data3 = {
'E':pd.Series(np.random.rand(2), index = ['a','b']),
'F':pd.Series(np.random.rand(3),index = ['x','y','z'])}
print('这是没有设置index的:\n', data1)
print('---------------------')
print('这是设置了index的:\n', data2)
print('---------------------')
print('这是设置了index并且都不一致:\n', data3)
print('---------------------')
# 由于data1和data2中的one是两行,two是三行,所以在打印的时候,第一列的最后一个值是NaN。
df1 = pd.DataFrame(data1)
df2 = pd.DataFrame(data2)
# 由于data3在设置的时候index都不一致,所以E列的后三个和F列的前两个全部都是NaN。
df3 = pd.DataFrame(data3)
print('注意index为2的第一个值:\n', df1)
print('---------------------')
print('注意index为c的第一个值:\n', df2)
print('---------------------')
print('注意index都不一致导致的结果:\n', df3)
运行结果如下:
这是没有设置index的:
{
'A': 0 0.216915
1 0.453241
dtype: float64, 'B': 0 0.223230
1 0.599316
2 0.546660
dtype: float64}
---------------------
这是设置了index的:
{
'C': a 0.500868
b 0.652345
dtype: float64, 'D': a 0.947658
b 0.272072
c 0.783097
dtype: float64}
---------------------
这是设置了index并且都不一致:
{
'E': a 0.638341
b 0.982684
dtype: float64, 'F': x 0.742875
y 0.471634
z 0.792849
dtype: float64}
---------------------
注意index为2的第一个值:
A B
0 0.216915 0.223230
1 0.453241 0.599316
2 NaN 0.546660
---------------------
注意index为c的第一个值:
C D
a 0.500868 0.947658
b 0.652345 0.272072
c NaN 0.783097
---------------------
注意index都不一致导致的结果:
E F
a 0.638341 NaN
b 0.982684 NaN
x NaN 0.742875
y NaN 0.471634
z NaN 0.792849
4、Dataframe 创建方法三
通过二维数组直接创建Dataframe。(这个方法是最常用的,尤其是在学习其他工具包的时候)。
通过二维数组创建的话如果不指定index和columns,两者均返回默认数字格式。因为数组本身是不带标签。
# index和colunms指定长度与原数组保持一致
ar = np.random.rand(9).reshape(3,3)
print(ar)
print('---------------------')
df1 = pd.DataFrame(ar)
df2 = pd.DataFrame(ar, index = ['a', 'b', 'c'], columns = ['x','y','z'])
# 可以尝试一下index或columns长度不等于已有数组的情况
#df3 = pd.DataFrame(ar, index = ['a','b','c'], colums = ['w','x','y','z'])
print('没有设置index和columns的情况:\n', df1)
print('---------------------')
print('设置了index和columns的情况:\n', df2)
# 如果index或columns长度不等于已有数组的话就会报错。
#print(df3)
运行结果如下:
[[0.73783499 0.72734161 0.57665585]
[0.60491658 0.83388939 0.03438341]
[0.22260236 0.91287993 0.94238993]]
---------------------
没有设置index和columns的情况:
0 1 2
0 0.737835 0.727342 0.576656