Python学习笔记-数据分析-Pandas02-Dataframe

本文详细介绍了Pandas中Dataframe的数据结构,包括如何创建DataFrame(如通过字典、二维数组、Series等方法),以及Dataframe的索引概念,包括基本选择、布尔型索引和多重索引。此外,还涵盖了基本操作,如数据的增删查改、转置、对齐和排序等操作。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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  张三  281  李四  292  王五  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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值