数据处理和统计分析 —— Pandas 基础(附数据集)

发布于:2025-08-19 ⋅ 阅读:(21) ⋅ 点赞:(0)

目录

一、概述

(一)series

1、组成

2、创建方式

3、Series常用属性

(二)DataFrame

1、组成:

2、构建方式

(三)数据导入和导出

二、加载数据集

加载部分数据

loc / iloc

三、分组和聚合计算

需求1:查询每个大洲的平均年龄寿命

需求2:查询各大洲的平均年龄和平均GDP

需求3:查询各个大洲和国家各自的,平均年龄寿命和平均GDP

需求4:查询各个大洲的,平均和最大GDP、年龄

需求5:查询各个大洲的,平均GDP和最大年龄

需求6:每个大洲列出了多少个国家和地区(去重)

需求7:去重后,打印所有国家个数/打印所有国家名称(去重后)

四、matplotlib绘图

数据集网盘下载:
链接:https://pan.quark.cn/s/0e577858dba3?pwd=FJnb
提取码:FJnb

一、概述

  • DataFrameSeries是Pandas最基本的两种数据结构
  • Series和Python中的列表非常相似,但是它的每个元素的数据类型必须相同
  • 在Pandas中,Series是一维容器,Series表示DataFrame的每一行或每一列
  • 可以把DataFrame理解成一张表
  • 可以把DataFrame看作由Series对象组成的字典,其中key是列名,值是Series

(一)series

1、组成

  • 索引(一组与之关联的标签,如果不显式的提供索引,pandas会自动创建一个从0开始的整数索引)
  • 数据(一组值(可以是任意numPy支持的数据类型:int、float、string等);

2、创建方式

        注意:index参数可以覆盖自动创建的索引序列(自定义)

  • 通过字典的方式创建
    import pandas as pd 
    s = pd.Series({'a':1,'b':2,'c':3,'d':4,'e':5})
    print(s)
    print(type(s))
  • 通过ndarray方式创建
    import pandas as pd 
    s = pd. Series([1,2,3,4,5])
    print(s)
    print(type(s))
  • 通过python的list方式创建
    import pandas as pd 
    import numpy as np
    arr = np.array([1,2,3,4,5])
    print(arr)
    print(type(arr))
    s = pd.Series(arr)
    print(s)
    print(type(s))
  • 通过元祖对象的方式创建
    import pandas as pd 
    s = pd.Series((1,2,3,4,5))
    print(s)
    print(type(s))

3、Series常用属性

# 1.导入pandas模块
import pandas as pd
import os

print(os.getcwd())
print("-------------------------------------------")

# 2.创建series,创建一个csv文件
# 使用read_csv函数,返回的是DataFrame对象,而不是Series对象
df = pd.read_csv('data/nobel_prizes.csv', index_col='id')
# print(df.head()) # 获取前5行数据

# 3.创建series
# 获取第一行数据
first = df.iloc[0]
print(first) # 获取第一行数据
print("-------------------------------------------")
print(type(first))
print("-------------------------------------------")
print(first.dtype) # 获取数据类型
print("-------------------------------------------")
print(first['year'],first['year'].dtype)
print("-------------------------------------------")
print(first.shape)
print("-------------------------------------------")
print(first.size)
print("-------------------------------------------")
print(first.index)
print("-------------------------------------------")
print(first.values)
  • 常用方法

# 1:导入pandas模块
import pandas as pd

# 2: 创建series对象
s1 = pd.Series([1, 2, 3, 4, 2, 3], index=['a', 'b', 'c', 'd', 'e', 'f'])
# """
# 核心区别:
# 形式          类型                  行为              返回值
# s1.max       方法对象(没有被调用)    返回方法本身       <bound method Series.max of
# s1.max()     方法调用               执行计算操作       实际的最大值
# """
# print(s1.max)
# print(s1.max())
# print(s1.size)
# print(s1.min())
print(s1)

print(s1.max)
print("--------------")
print(s1.max())
print("--------------")
print(s1.to_list()) # [1, 2, 3, 4, 2, 3]
print("--------------")
print(s1.to_list) # [1, 2, 3, 4, 2, 3]

# 3:演示series的常用方法
print(len(s1)) # 6
print(s1.size) # 6
print(s1.head()) # 默认打印前五条
print(s1.head(3)) # 打印前3条
print(s1.tail())  # 默认打印后5条
print(s1.tail(3)) # 打印后3条
print(s1.index) # Index(['a', 'b', 'c', 'd', 'e', 'f'], dtype='object')
print(s1.keys())  # Index(['a', 'b', 'c', 'd', 'e', 'f'], dtype='object')
print(s1.values) # [1 2 3 4 2 3]
print(s1.to_list()) # [1, 2, 3, 4, 2, 3]
print(type(s1.to_list())) # <class 'list'>

print("---------------------------")
print(s1.describe()) # 统计信息
print(s1.max())     # 获取series的元素最大值
print(s1.min())       # 获取series的元素最小值
print(s1.mean())      # 获取series的元素平均值
print(s1.median())    # 获取series的元素中位数
print(s1.mode())      # 获取series的元素众数
print(s1.std())       # 获取series的元素标准差

print("---------------------------")
print(s1.drop_duplicates())# 删除重复的元素
print(s1.sort_values())# 排序,根据值排序,默认是升序
print(s1.sort_values())# 排序,根据值排序,默认是升序
print(s1.sort_values(ascending=False))# 排序,根据值排序,降序
print(s1.sort_index())  # 排序,根据索引排序,默认是升序
print(s1.sort_index(ascending=False)) # 排序,根据索引排序,降序
print(s1.unique()) # 去重
print(s1.value_counts()) # 统计每个元素出现的次数

(二)DataFrame

  • 可以看成是一个二维表格(行列),类似于Excel表格
  • 每一列就是一个series,所有列共享一个索引

1、组成:

  • 列: 每一列就是一个series,所有的列共享同一个索引
  • 行: 由索引标记的每一行数据(行索引)
  • 索引: 行的标签,称之为行索引,如果不指定,pandas会自动创建(0,1,2....)
  • 列索引(column): 列的标签,也称为列名。

2、构建方式

使用字典来创建DataFrame

import pandas as pd
s = {
    'name':['张三','李四','王五'],
    'age':[18,19,31],
    'sex':['男','女','男']}
df = pd.DataFrame(s)
print(df)
print(type(df))

创建DataFrame的时指定列的顺序和行索引

# 创建DataFrame的时指定列的顺序和行索引
import pandas as pd
df = pd.DataFrame({
    'name':['张三','李四','王五'],
    'age':[18,19,31],
    'sex':['男','女','男']},index=['a','b','c'],columns=['name','age','sex','id'])
print(df)
print(type(df))

(三)数据导入和导出

1、保存pickle文件
        可以使用pd.read_pickle函数读取.pickle文件中的数据

import pandas as pd
# 读取movie.csv文件
movie_fd = pd.read_csv('data/movie.csv')
# 将读取的数据保存为pickle文件
movie_fd.to_pickle('data/movie.pickle')
movie_fd.head()

2、保存csv文件
        在CSV文件中,对于每一行,各列采用逗号分隔
        CSV是数据协作和共享的首选格式

import pandas as pd
movie_fd.to_csv('data/movie2.csv')
movie_fd2 = pd.read_csv('data/movie2.csv')
movie_fd2.head()

二、加载数据集

目的:
        1、做数据分析首先要加载数据,并查看其结构和内容,对数据有初步的了解
        2、查看行,列数据分布情况
        3、查看每一列中存储信息的类型

import pandas as pd

data = pd.read_csv('data/movie.csv')  # 读取数据
print(data.head())  # 查看前5行数据

# 也可以通过指定分隔符加载tsv文件
data = pd.read_csv('data/gapminder.tsv', sep='\t')
data.head()

加载部分数据

加载一列数据,通过df['列名']方式获取

print(df['movie_title'])

加载多列数据,通过df[['列名1','列名2',...]]

print(df[['movie_title', 'imdb_score']])

获取第4行数据

获取第1行和第62行和83行数据

print(df.loc[[3]]) 
print(df.loc[[0, 61, 82]]) 

loc / iloc

需要注意的是,iloc传入的是索引的序号,loc是索引的标签
        如果loc 和 iloc 传入的参数弄混了,会报错
loc 只能接受行/列 的名字,iloc只能接受行/列的序号

# 获取第1行和第62行和83行数据
print(df.iloc[[0, 61, 82]])
# 获取前3行数据
print(df.iloc[:3])
# 使用iloc时可以传入-1来获取最后一行数据,使用loc的时候不行
print(df.iloc[[-1]])

import pandas as pd

df = pd.read_csv('data/scientists.csv')

print(df.loc[0, ['Name', 'Age', 'Born']])  # 获取第1行数据的三列数据
print("-----------------------------------------------------------------------")
print(df.loc[[0, 1], ['Name', 'Age', 'Born']])  # 获取第1行和第2行数据,三列数据
print("-----------------------------------------------------------------------")
tmp_range = list(range(3, 5))
print(tmp_range)  # 获取连续多列数据
print(df.iloc[:, tmp_range])
print("-----------------------------------------------------------------------")
print(df.iloc[0, 1])  # 获取第1行第2列数据
print("-----------------------------------------------------------------------")
print(df.iloc[[0, 1, 5], [1, 2]])  # 获取第1行和第2行第6行、第2列和第3列数据
print("-----------------------------------------------------------------------")
print(df.iloc[0:3, 0:3])  # 获取第1行到第3行、第1列到第3列数据
print("-----------------------------------------------------------------------")
print(df.iloc[:, 1:5:2])  # 获取第2列到第5列、步长为2的数据
print("-----------------------------------------------------------------------")
# 获取第1列、第3列、第4列的数据
print(df.iloc[:, [True, False, True, True, False]])

知识点总结

三、分组和聚合计算

需求1:查询每个大洲的平均年龄寿命

# 分组操作
print(df.groupby('continent'))
# 写法一
print(df.groupby('continent')['lifeExp'].mean())
print("--------------------------------------------------")
# 写法二
print(df.groupby('continent').lifeExp.mean())

需求2:查询各大洲的平均年龄和平均GDP

print(df.groupby('continent')[['lifeExp','gdpPercap']].mean())

需求3:查询各个大洲和国家各自的,平均年龄寿命和平均GDP

print(df.groupby(['continent','country'])[['lifeExp','gdpPercap']].mean())

需求4:查询各个大洲的,平均和最大GDP、年龄

# 写法1:
print(df.groupby('continent')[['lifeExp','gdpPercap']].aggregate(['mean','max']))

需求5:查询各个大洲的,平均GDP和最大年龄

# 写法2:
print(df.groupby('continent').aggregate({'lifeExp':'mean','gdpPercap':'max'}))

需求6:每个大洲列出了多少个国家和地区(去重)

print(df.groupby('continent')['country'].nunique())
print("--------------------------------------------------")
# 每个大洲列出了多少个国家(不去重)
print(df.groupby('continent')['country'].size())

需求7:去重后,打印所有国家个数/打印所有国家名称(去重后)

print(df['country'].nunique())  
print(df['country'].unique())   
运行结果:
142
['Afghanistan' 'Albania' 'Algeria' 'Angola' 'Argentina' 'Australia'
 'Austria' 'Bahrain' 'Bangladesh' 'Belgium' 'Benin' 'Bolivia'
 'Bosnia and Herzegovina' 'Botswana' 'Brazil' 'Bulgaria' 'Burkina Faso'
 'Burundi' 'Cambodia' 'Cameroon' 'Canada' 'Central African Republic'
 'Chad' 'Chile' 'China' 'Colombia' 'Comoros' 'Congo, Dem. Rep.'
 'Congo, Rep.' 'Costa Rica' "Cote d'Ivoire" 'Croatia' 'Cuba'
 'Czech Republic' 'Denmark' 'Djibouti' 'Dominican Republic' 'Ecuador'
 'Egypt' 'El Salvador' 'Equatorial Guinea' 'Eritrea' 'Ethiopia' 'Finland'
 'France' 'Gabon' 'Gambia' 'Germany' 'Ghana' 'Greece' 'Guatemala' 'Guinea'
 'Guinea-Bissau' 'Haiti' 'Honduras' 'Hong Kong(China)' 'Hungary' 'Iceland'
 'India' 'Indonesia' 'Iran' 'Iraq' 'Ireland' 'Israel' 'Italy' 'Jamaica'
 'Japan' 'Jordan' 'Kenya' 'Korea, Dem. Rep.' 'Korea, Rep.' 'Kuwait'
 'Lebanon' 'Lesotho' 'Liberia' 'Libya' 'Madagascar' 'Malawi' 'Malaysia'
 'Mali' 'Mauritania' 'Mauritius' 'Mexico' 'Mongolia' 'Montenegro'
 'Morocco' 'Mozambique' 'Myanmar' 'Namibia' 'Nepal' 'Netherlands'
 'New Zealand' 'Nicaragua' 'Niger' 'Nigeria' 'Norway' 'Oman' 'Pakistan'
 'Panama' 'Paraguay' 'Peru' 'Philippines' 'Poland' 'Portugal'
 'Puerto Rico' 'Reunion' 'Romania' 'Rwanda' 'Sao Tome and Principe'
 'Saudi Arabia' 'Senegal' 'Serbia' 'Sierra Leone' 'Singapore'
 'Slovak Republic' 'Slovenia' 'Somalia' 'South Africa' 'Spain' 'Sri Lanka'
 'Sudan' 'Swaziland' 'Sweden' 'Switzerland' 'Syria' 'Taiwan(China)'
 'Tanzania' 'Thailand' 'Togo' 'Trinidad and Tobago' 'Tunisia' 'Turkey'
 'Uganda' 'United Kingdom' 'United States' 'Uruguay' 'Venezuela' 'Vietnam'
 'West Bank and Gaza' 'Yemen, Rep.' 'Zambia' 'Zimbabwe']

四、matplotlib绘图

import pandas as pd
import matplotlib.pyplot as plt

df = pd.read_csv('data/gapminder.tsv', sep='\t')
globals_yearly_life_expectancy = df.groupby('year')['lifeExp'].mean()
print(globals_yearly_life_expectancy)
globals_yearly_life_expectancy.plot()
plt.show()


网站公告

今日签到

点亮在社区的每一天
去签到