pandas库基础笔记
基础概念
- DataFrame,相当于一个数据表,存储了所有的数据,包含行和命名的列
- Series,相当于一个列,一个DataFrame有一个或者多个Series
简单地建立一个Series:
pd.Series(['San Francisco', 'San Jose', 'Sacramento'])
DataFrame可以通过字典的方式,来映射列的名和列的编号,比如:
city_names = pd.Series(['San Francisco', 'San Jose', 'Sacramento'])
population = pd.Series([852469, 1015785, 485199])test = pd.DataFrame({ 'City name': city_names, 'Population': population })print(test)
得到如下输出:
City name Population
0 San Francisco 852469
1 San Jose 1015785
2 Sacramento 485199
如果我们只是想输出数据集的前几行,可以使用head
属性,默认输出前五行。
print(test.head(1))
输出:
City name Population
0 San Francisco 852469
字典数据可以进行pandas化,那么反过来,pandas数据也可以进行字典化,一上面的数据为例子:
import pandas as pdcity_names = pd.Series(['San Francisco', 'San Jose', 'Sacramento'])
population = pd.Series([852469, 1015785, 485199])my_data = pd.DataFrame({'City name': city_names, 'Population': population})my_dic = dict(my_data)
print(my_dic)
输出结果:
{'City name': 0 San Francisco
1 San Jose
2 Sacramento
Name: City name, dtype: object, 'Population': 0 852469
1 1015785
2 485199
Name: Population, dtype: int64}
总结一下,pandas可以看成一个高阶的字典类型的数据(可能不是十分恰当)
获取数据
可以通过字典的方式引用列,支持索引和切片操作。
比如:
print(test['City name'])
print(test['City name'][1])
print(test['City name'][0:2])
输出结果
0 San Francisco
1 San Jose
2 Sacramento
Name: City name, dtype: object
San Jose
0 San Francisco
1 San Jose
Name: City name, dtype: object
使用describe输出详细信息:
print(test.describe())
输出:
count 3.000000e+00
mean 7.844843e+05
std 2.717477e+05
min 4.851990e+05
25% 6.688340e+05
50% 8.524690e+05
75% 9.341270e+05
max 1.015785e+06
dtype: float64
操作数据
- 支持一般的python数值计算
- 支持numpy库函数的计算
- 支持类似于python的map操作,需要使用apply方法:
print(population.apply(lambda x: x > 1000000)) ```
把子列转化成新的Dataframe数据
把一列数据转换成新的Dataframe类型 。使用两个[]
表示转换成一个新的DataFrame,否则就是单纯地取出一个Series
。
import pandas as pdc1 = pd.Series(['a', 'b', 'c', 'd'])
c2 = pd.Series([1, 2, 3, 4])
c3 = pd.Series(['A', 'B', 'C', 'D'])
data = pd.DataFrame({'c1': c1, 'c2': c2, 'c3': c3})print(data)
print(type(data))tmp = data['c1'] # 仅仅使用一个中括号
print(tmp)
print(type(tmp))tmp1 = data[['c1']] # 使用两层中括号
print(tmp1)
print(type(tmp1))tmp2 = data[['c1', 'c2']]
print(tmp2)
print(type(tmp2))
结果
c1 c2 c3
0 a 1 A
1 b 2 B
2 c 3 C
3 d 4 D
<class 'pandas.core.frame.DataFrame'>
0 a
1 b
2 c
3 d
Name: c1, dtype: object
<class 'pandas.core.series.Series'>c1
0 a
1 b
2 c
3 d
<class 'pandas.core.frame.DataFrame'>c1 c2
0 a 1
1 b 2
2 c 3
3 d 4
<class 'pandas.core.frame.DataFrame'>
乱序操作
使用pandas.reindex
即可进行乱序操作。根据下标从小到大排列。比如:
import pandas as pd
city = pd.Series(['Beijing', 'Shanghai', 'Guangzhou', 'Shenzhen'])
population = pd.Series([2000, 1000, 1500, 800])
square = pd.Series([100.4, 86.6, 77.8, 91.3])
city_info = pd.DataFrame(['City':city, 'Population':population, 'Square':square])print(city_info)
# 指定乱序
city_info.reindex([3, 1, 2])
print(city_info)
# 随机乱序
city_info.reindex(np.random.permutation.permutation(city_info.size))
print(city_info)
取出分位数
pd.quantile
是取出分位数,这在数据数据分区间时,非常有用。给出官网的代码示例:
import pandas as pd
import numpy as npdf = pd.DataFrame(np.array([[1, 1], [2, 10], [3, 100], [4, 100]]),columns=['a', 'b'])data1 = df.quantile(.1)
data2 = df.quantile(([.1, .5]))print(type(data1))
print(data1)
print("----------")
print(type(data2))
print(data2)
程序输出结果:
<class 'pandas.core.series.Series'>
a 1.3
b 3.7
Name: 0.1, dtype: float64
----------
<class 'pandas.core.frame.DataFrame'>a b
0.1 1.3 3.7
0.5 2.5 55.0
如果只是单纯的一个数,那么返回的是一个Series
,对应有关列的分位数。如果是一个列表,那么返回一个DataFrame
,对应的是每个列不同分位数所对应的值。
读取数据和存储数据
从网络或者本地文件中读取csv数据,或者把已有的数据存到csv文件中。一般和os配合使用
import os
import pandas as pdmy_data = None
# 先判断是否存在文件,不存在直接从网络下载,存在的话直接读取
if os.path.exists('data.csv'):my_data = pd.read_csv('data.csv', sep=",")
else:my_data = pd.read_csv("https://storage.googleapis.com/mledu-datasets/california_housing_train.csv",sep=",")my_data.to_csv('data.csv')
另一种从文件中读取数据的方式:
import os
import pandas as pd
import numpy as npN = 2if os.path.exists('my_data.csv'):my_data = pd.read_csv('my_data.csv')
else:c1 = 20 * np.ones(N) + np.random.randn(N) * 2.0 # 20-25的正太分布c2 = 3 * np.ones(N) + np.random.randn(N) # 3-4的正太分布c3 = -7 * np.ones(N) + np.random.randn(N) # -6~-7正太res = c1 + c2 + c3c1 = pd.Series(c1)c2 = pd.Series(c2)c3 = pd.Series(c3)res = pd.Series(res)my_data = pd.DataFrame({"res": res, "c1": c1, "c2": c2, "c3": c3})my_data.to_csv('my_data.csv')
# 自定义命名列,从第0行开始读取
tmp = pd.read_csv(filepath_or_buffer='my_data.csv', names=['c1', 'c2', 'c3', 'res'], header=0)
print(tmp)
注意,上述方法中,如果新命名的数据列与原来的数据列不一致,那么会以新命名的数据列为准!!
插入和删除列(行)
pop弹出一列
弹出制定的列,并返回。
import pandas as pdc1 = pd.Series(['a', 'b', 'c', 'd'])
c2 = pd.Series([1, 2, 3, 4])
c3 = pd.Series(['A', 'B', 'C', 'D'])
data = pd.DataFrame({'c1': c1, 'c2': c2, 'c3': c3})tmp = data.pop('c1') # Series类型print(tmp)
print(type(tmp))print(data)
输出结果:
0 a
1 b
2 c
3 d
Name: c1, dtype: object
<class 'pandas.core.series.Series'>c2 c3
0 1 A
1 2 B
2 3 C
3 4 D
insert插入数据
在制定的位置插入一列数据
import pandas as pdc1 = pd.Series(['a', 'b', 'c', 'd'])
c2 = pd.Series([1, 2, 3, 4])
c3 = pd.Series(['A', 'B', 'C', 'D'])
data = pd.DataFrame({'c1': c1, 'c2': c2, 'c3': c3})
data.pop('c1') # 删除第一列
data.insert(loc=0, column='c1', value=c1) # 重新插入到第一列
print(data)
drop删除数据
import pandas as pdc1 = pd.Series(['a', 'b', 'c', 'd'])
c2 = pd.Series([1, 2, 3, 4])
c3 = pd.Series(['A', 'B', 'C', 'D'])
data = pd.DataFrame({'c1': c1, 'c2': c2, 'c3': c3})# 列的名称,axis=1表示对列进行删除,axis=0表示删除行,需要添加行的索引;inplace=True表示在原数据上操作
data.drop(columns='c1', axis=1, inplace=True)
print(data)
输出:
c2 c3
0 1 A
1 2 B
2 3 C
3 4 D
分位点和分位数
根据给定的分位数,计算出分位点,函数pd.Datafrane.quantile()
import pandas as pd
import numpy as npdf4 = pd.DataFrame(np.arange(100).reshape(20, 5),columns=list('abcde'))
print(df4)for i in np.arange(0, 1, 0.2):print(df4.quantile(i))
输出每一列的分位点:
a b c d e
0 0 1 2 3 4
1 5 6 7 8 9
2 10 11 12 13 14
3 15 16 17 18 19
4 20 21 22 23 24
5 25 26 27 28 29
6 30 31 32 33 34
7 35 36 37 38 39
8 40 41 42 43 44
9 45 46 47 48 49
10 50 51 52 53 54
11 55 56 57 58 59
12 60 61 62 63 64
13 65 66 67 68 69
14 70 71 72 73 74
15 75 76 77 78 79
16 80 81 82 83 84
17 85 86 87 88 89
18 90 91 92 93 94
19 95 96 97 98 99
a 0.0
b 1.0
c 2.0
d 3.0
e 4.0
Name: 0.0, dtype: float64
a 19.0
b 20.0
c 21.0
d 22.0
e 23.0
Name: 0.2, dtype: float64
a 38.0
b 39.0
c 40.0
d 41.0
e 42.0
Name: 0.4, dtype: float64
a 57.0
b 58.0
c 59.0
d 60.0
e 61.0
Name: 0.6000000000000001, dtype: float64
a 76.0
b 77.0
c 78.0
d 79.0
e 80.0
Name: 0.8, dtype: float64
还可以求解多个分位点,用np.array传入数据:
import numpy as np
import pandas as pdnum_buckets = 10
df = pd.DataFrame(np.arange(100).reshape(10, 10))
boundaries = np.arange(1.0, num_buckets) / num_buckets
print(boundaries)
print(df)
quantitles = df.quantile(boundaries)
print(quantitles)
输出结果:
[0.1 0.2 0.3 0.4 0.5 0.6 0.7 0.8 0.9]0 1 2 3 4 5 6 7 8 9
0 0 1 2 3 4 5 6 7 8 9
1 10 11 12 13 14 15 16 17 18 19
2 20 21 22 23 24 25 26 27 28 29
3 30 31 32 33 34 35 36 37 38 39
4 40 41 42 43 44 45 46 47 48 49
5 50 51 52 53 54 55 56 57 58 59
6 60 61 62 63 64 65 66 67 68 69
7 70 71 72 73 74 75 76 77 78 79
8 80 81 82 83 84 85 86 87 88 89
9 90 91 92 93 94 95 96 97 98 990 1 2 3 4 5 6 7 8 9
0.1 9.0 10.0 11.0 12.0 13.0 14.0 15.0 16.0 17.0 18.0
0.2 18.0 19.0 20.0 21.0 22.0 23.0 24.0 25.0 26.0 27.0
0.3 27.0 28.0 29.0 30.0 31.0 32.0 33.0 34.0 35.0 36.0
0.4 36.0 37.0 38.0 39.0 40.0 41.0 42.0 43.0 44.0 45.0
0.5 45.0 46.0 47.0 48.0 49.0 50.0 51.0 52.0 53.0 54.0
0.6 54.0 55.0 56.0 57.0 58.0 59.0 60.0 61.0 62.0 63.0
0.7 63.0 64.0 65.0 66.0 67.0 68.0 69.0 70.0 71.0 72.0
0.8 72.0 73.0 74.0 75.0 76.0 77.0 78.0 79.0 80.0 81.0
0.9 81.0 82.0 83.0 84.0 85.0 86.0 87.0 88.0 89.0 90.0
显示了每一个列的,的对应的分位点。
pandas库基础笔记相关推荐
- Python 数据分析与展示笔记4 -- Pandas 库基础
Python 数据分析与展示笔记4 – Pandas 库基础 Python 数据分析与展示系列笔记是笔者学习.实践Python 数据分析与展示的相关笔记 课程链接: Python 数据分析与展示 参考 ...
- pandas库基础学习
pandas库基础学习 1.Pandas模块的数据结构 Pandas模块的数据结构主要有两种: Series DataFrame Series 是一维数组,基于Numpy的ndarray 结构 Dat ...
- 数据分析一、 pandas库基础知识
pandas库基础知识 一.jupyter 代码编辑器 概述:Python 数据分析库介绍 二.pandas 库基础知识 (1)常用的Series属性与方法: (2) DataFrame常用方法 1. ...
- python中不能使用索引运算的是_Python数据分析之Pandas库(笔记)
Pandas数据结构 pandas有两个基本的数据结构:Series和DataFrame. 1.1 创建Series数据 需要引入pandas模块:import pandas as pd 需要引入Se ...
- Pandas库学习笔记
import pandas as pd 两个数据类型:Series,DataFrame pandas是基于Numpy实现的扩展库,提供了高效地操作大型数据集所需的工具. Series类型由一组数据和与 ...
- Python之pandas库--基础
目录 创建新的工作簿 新建工作簿同时写入数据 设置索引 读取数据 txt和CSV文件转化 读取数据库内容 pandas数据结构 DataFrame用法 实现VLOOKUP功能 需求:将总分调整顺序,放 ...
- Pandas 统计分析基础 笔记4 任务4.4 使用分组聚合进行组内计算
文章目录 pandas_任务4.4 使用分组聚合进行组内计算 4.4.1 使用groupby方法拆分数据 代码 4-51 对菜品订单详情表依据订单编号分组 代码 4-52 GroupBy 类求均值,标 ...
- Pandas 统计分析基础 笔记5 _任务4.5 创建透视表与交叉表
文章目录 pandas__任务4.5 创建透视表与交叉表 4.5 创建透视表与交叉表 代码4-67 使用订单号作为透视表索引制作透视表 代码 4-68 修改聚合函数后的透视表 代码 4-69 使用订单 ...
- Pandas 统计分析基础 笔记2 任务4.2 掌握DataFrame的常用操作
文章目录 pandas_任务4.2 掌握DataFrame的常用操作 代码4-12 订单详情表的4个基本属性 4-13 size,ndim,shape属性的使用 4-14 使用T属性进行转置 4-15 ...
最新文章
- java 手机音频播放,用Java实现音频播放
- 视频监控软件 SecuritySpy 简介
- 2020亚太杯数学建模_比赛 | 2020年APMCM亚太地区大学生数学建模竞赛
- hdu区域赛在线热身赛 暨 第十二场组队赛
- oracle dg物理和逻辑,Oracle DG介绍(物理无实例)
- AndroidStudio_android中实现图片动态设置图片的位置以及图片动态缩放---Android原生开发工作笔记234
- 人民日报发推欢迎Google重返大陆,FB上长文阐述详细立场
- 比较nio大体上优于io的方面
- qt deleterLater
- 海量数据存储的解决方案(分布式数据库)
- Centos 7.9系统安装网卡驱动
- mysql随机生成 姓名+电话
- 2015年动画电影观影指南
- 【渝粤题库】陕西师范大学292161社会保障概论 作业(专升本)
- Linux网络——部署yum仓库
- SAP MM移动平均价和标准价逻辑
- 解读小米模式:颠覆式创新者的背后
- 博途TIA Portal V15 下载与安装教程
- libusb函数说明
- MySQL中什么是关系型数据库???
热门文章
- 【五级流水线CPU】—— 7. 协处理器访问指令(2条)
- JS小技巧 ----- 在onmousedown事件下避免文本选取
- UnicodeDecodeError: 'utf8' codec can't decode byte 0xd1 in position 0: invalid continuation byte问题
- Struts2一个诡异问题的解决
- PHP23 AJAX分页
- [hihocoder][Offer收割]编程练习赛46
- HDU 1422 重温世界杯 (dp)
- cocoapods的安装使用
- windows和linux下读取文件乱码的终极解决办法!
- LeetCode:Add Binary