Python pandas秘籍第四、五、六章个人笔记

2023-10-21 18:59

本文主要是介绍Python pandas秘籍第四、五、六章个人笔记,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

关注微信公共号:小程在线

关注CSDN博客:程志伟的博客

 

完整脚本在公共号有链接

 

Python 3.7.6 (default, Jan  8 2020, 20:23:39) [MSC v.1916 64 bit (AMD64)]
Type "copyright", "credits" or "license" for more information.

IPython 7.12.0 -- An enhanced Interactive Python.

import pandas as pd

第四章

#4.1 DataFrame 中刚添加 weekday 列

bikes = pd.read_csv('bikes.csv', sep=';', encoding='latin1', parse_dates=['Date'], dayfirst=True, index_col='Date')
bikes['Berri 1'].plot()
Out[2]: <matplotlib.axes._subplots.AxesSubplot at 0x276a4e95708>

#所以我们要创建一个只有 Berri 自行车道的 DataFrame

berri_bikes = bikes[['Berri 1']]
berri_bikes[:5]
Out[3]: 
            Berri 1
Date               
2012-01-01       35
2012-01-02       83
2012-01-03      135
2012-01-04      144
2012-01-05      197

 

接下来, 我们需要添加一列 weekday 。 首先, 我们可以从索引得到星期。 我们还没有谈到索引, 但索引在上面的 DataFrame 中是左边的东西, 在 Date 下面。 它基本上是一年中的所有日子。

berri_bikes.index
Out[4]: 
DatetimeIndex(['2012-01-01', '2012-01-02', '2012-01-03', '2012-01-04',
               '2012-01-05', '2012-01-06', '2012-01-07', '2012-01-08',
               '2012-01-09', '2012-01-10',
               ...
               '2012-10-27', '2012-10-28', '2012-10-29', '2012-10-30',
               '2012-10-31', '2012-11-01', '2012-11-02', '2012-11-03',
               '2012-11-04', '2012-11-05'],
              dtype='datetime64[ns]', name='Date', length=310, freq=None)

 

我们想得到每一行的月份中的日期, 我们可以这样做:
berri_bikes.index.day
Out[6]: 
Int64Index([ 1,  2,  3,  4,  5,  6,  7,  8,  9, 10,
            ...
            27, 28, 29, 30, 31,  1,  2,  3,  4,  5],
           dtype='int64', name='Date', length=310)

 

我们实际上想要星期
berri_bikes.index.weekday
Out[7]: 
Int64Index([6, 0, 1, 2, 3, 4, 5, 6, 0, 1,
            ...
            5, 6, 0, 1, 2, 3, 4, 5, 6, 0],
           dtype='int64', name='Date', length=310)

 

这是周中的日期, 其中 0 是星期一。 我通过查询日历得到 0 是星期一。
现在我们知道了如何获取星期, 我们可以将其添加到我们的 DataFrame 中作为一列:
berri_bikes['weekday'] = berri_bikes.index.weekday
berri_bikes[:5]
__main__:1: SettingWithCopyWarning: 
A value is trying to be set on a copy of a slice from a DataFrame.
Try using .loc[row_indexer,col_indexer] = value instead

See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy
Out[8]: 
            Berri 1  weekday
Date                        
2012-01-01       35        6
2012-01-02       83        0
2012-01-03      135        1
2012-01-04      144        2
2012-01-05      197        3

 

#4.2 按星期统计骑手

 

按星期对行分组, 然后将星期相同的所有值相加”。

weekday_counts = berri_bikes.groupby('weekday').aggregate(sum)
weekday_counts
Out[9]: 
         Berri 1
weekday         
0         134298
1         135305
2         152972
3         160131
4         141771
5         101578
6          99310

weekday_counts.index = ['Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday', 'Sunday']
weekday_counts
Out[10]: 
           Berri 1
Monday      134298
Tuesday     135305
Wednesday   152972
Thursday    160131
Friday      141771
Saturday    101578
Sunday       99310

 

#4.3完整代码


bikes = pd.read_csv('bikes.csv',
                    sep=';', encoding='latin1',
                    parse_dates=['Date'], dayfirst=True,
                    index_col='Date')
# 添加 weekday 列
berri_bikes = bikes[['Berri 1']]
berri_bikes['weekday'] = berri_bikes.index.weekday
# 按照星期累计骑手, 并绘制出来
weekday_counts = berri_bikes.groupby('weekday').aggregate(sum)
weekday_counts.index = ['Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday', 'Sunday']
weekday_counts.plot(kind='bar')

 

第五章

 

因为数据原因,跳过

url_template = "http://climate.weather.gc.ca/climateData/bulkdata_e.html?format=csv&stationID=5415&Year={year}&Month={month}&timeframe=1&submit=Download+Data"
url = url_template.format(month=3, year=2012)
weather_mar2012 = pd.read_csv(url, skiprows=16, index_col='Date/Time', parse_dates=True, encoding='latin1')
weather_mar2012
Traceback (most recent call last):

  File "<ipython-input-11-71520743bd8a>", line 3, in <module>
    weather_mar2012 = pd.read_csv(url, skiprows=16, index_col='Date/Time', parse_dates=True, encoding='latin1')

  File "E:\anaconda3\lib\site-packages\pandas\io\parsers.py", line 676, in parser_f
    return _read(filepath_or_buffer, kwds)

  File "E:\anaconda3\lib\site-packages\pandas\io\parsers.py", line 431, in _read
    filepath_or_buffer, encoding, compression

  File "E:\anaconda3\lib\site-packages\pandas\io\common.py", line 172, in get_filepath_or_buffer
    req = urlopen(filepath_or_buffer)

  File "E:\anaconda3\lib\site-packages\pandas\io\common.py", line 141, in urlopen
    return urllib.request.urlopen(*args, **kwargs)

  File "E:\anaconda3\lib\urllib\request.py", line 222, in urlopen
    return opener.open(url, data, timeout)

  File "E:\anaconda3\lib\urllib\request.py", line 531, in open
    response = meth(req, response)

  File "E:\anaconda3\lib\urllib\request.py", line 641, in http_response
    'http', request, response, code, msg, hdrs)

  File "E:\anaconda3\lib\urllib\request.py", line 563, in error
    result = self._call_chain(*args)

  File "E:\anaconda3\lib\urllib\request.py", line 503, in _call_chain
    result = func(*args)

  File "E:\anaconda3\lib\urllib\request.py", line 755, in http_error_302
    return self.parent.open(new, timeout=req.timeout)

  File "E:\anaconda3\lib\urllib\request.py", line 531, in open
    response = meth(req, response)

  File "E:\anaconda3\lib\urllib\request.py", line 641, in http_response
    'http', request, response, code, msg, hdrs)

  File "E:\anaconda3\lib\urllib\request.py", line 569, in error
    return self._call_chain(*args)

  File "E:\anaconda3\lib\urllib\request.py", line 503, in _call_chain
    result = func(*args)

  File "E:\anaconda3\lib\urllib\request.py", line 649, in http_error_default
    raise HTTPError(req.full_url, code, msg, hdrs, fp)

HTTPError: Not Found

 

 

第六章


import pandas as pd
weather_2012 = pd.read_csv('weather_2012.csv', parse_dates=True, index_col='Date/Time')
weather_2012[:5]
Out[20]: 
                     Temp (C)  ...               Weather
Date/Time                      ...                      
2012-01-01 00:00:00      -1.8  ...                   Fog
2012-01-01 01:00:00      -1.8  ...                   Fog
2012-01-01 02:00:00      -1.8  ...  Freezing Drizzle,Fog
2012-01-01 03:00:00      -1.5  ...  Freezing Drizzle,Fog
2012-01-01 04:00:00      -1.5  ...                   Fog

[5 rows x 7 columns]

 

#6.1 字符串操作

weather_description = weather_2012['Weather']
is_snowing = weather_description.str.contains('Snow')
is_snowing[:5]
Out[21]: 
Date/Time
2012-01-01 00:00:00    False
2012-01-01 01:00:00    False
2012-01-01 02:00:00    False
2012-01-01 03:00:00    False
2012-01-01 04:00:00    False
Name: Weather, dtype: bool

is_snowing.plot()
Traceback (most recent call last):

  File "<ipython-input-22-fffdae324377>", line 1, in <module>
    is_snowing.plot()

  File "E:\anaconda3\lib\site-packages\pandas\plotting\_core.py", line 847, in __call__
    return plot_backend.plot(data, kind=kind, **kwargs)

  File "E:\anaconda3\lib\site-packages\pandas\plotting\_matplotlib\__init__.py", line 61, in plot
    plot_obj.generate()

  File "E:\anaconda3\lib\site-packages\pandas\plotting\_matplotlib\core.py", line 261, in generate
    self._compute_plot_data()

  File "E:\anaconda3\lib\site-packages\pandas\plotting\_matplotlib\core.py", line 410, in _compute_plot_data
    raise TypeError("no numeric data to plot")

TypeError: no numeric data to plot

解决方法:
is_snowing.astype(float).plot()
Out[23]: <matplotlib.axes._subplots.AxesSubplot at 0x276a63ae508>

 

#6.2 使用 resample 找到下雪最多的月份


import numpy as np

weather_2012['Temp (C)'].resample('M', how=np.median).plot(kind='bar')
Traceback (most recent call last):

  File "<ipython-input-26-59c50ec9a1b7>", line 1, in <module>
    weather_2012['Temp (C)'].resample('M', how=np.median).plot(kind='bar')

TypeError: resample() got an unexpected keyword argument 'how'


weather_2012['Temp (C)'].resample('M').median().plot(kind='bar')
Out[30]: <matplotlib.axes._subplots.AxesSubplot at 0x276a6427448>


毫无奇怪, 七月和八月是最暖和的。

 

然后使用 resample 寻找每个月下雪的时间比例。
is_snowing.astype(float).resample('M').mean()
Out[7]: 
Date/Time
2012-01-31    0.240591
2012-02-29    0.162356
2012-03-31    0.087366
2012-04-30    0.015278
2012-05-31    0.000000
2012-06-30    0.000000
2012-07-31    0.000000
2012-08-31    0.000000
2012-09-30    0.000000
2012-10-31    0.000000
2012-11-30    0.038889
2012-12-31    0.251344
Freq: M, Name: Weather, dtype: float64

is_snowing.astype(float).resample('M').mean().plot(kind='bar')
Out[8]: <matplotlib.axes._subplots.AxesSubplot at 0x22a7042d488>

 

#6.3 将温度和降雪绘制在一起
temperature = weather_2012['Temp (C)'].resample('M').median()
is_snowing = weather_2012['Weather'].str.contains('Snow')
snowiness = is_snowing.astype(float).resample('M').median()
 

temperature.name = "Temperature"
snowiness.name = "Snowiness"

stats = pd.concat([temperature, snowiness], axis=1)
stats
Out[16]: 
            Temperature  Snowiness
Date/Time                         
2012-01-31        -7.05        0.0
2012-02-29        -4.10        0.0
2012-03-31         2.60        0.0
2012-04-30         6.30        0.0
2012-05-31        16.05        0.0
2012-06-30        19.60        0.0
2012-07-31        22.90        0.0
2012-08-31        22.20        0.0
2012-09-30        16.10        0.0
2012-10-31        11.30        0.0
2012-11-30         1.05        0.0
2012-12-31        -2.85        0.0

stats.plot(kind='bar')
Out[17]: <matplotlib.axes._subplots.AxesSubplot at 0x22a72571688>

stats.plot(kind='bar', subplots=True, figsize=(15, 10))
Out[18]: 
array([<matplotlib.axes._subplots.AxesSubplot object at 0x0000022A7254CEC8>,
       <matplotlib.axes._subplots.AxesSubplot object at 0x0000022A722C0E08>],
      dtype=object)

这篇关于Python pandas秘籍第四、五、六章个人笔记的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/256330

相关文章

Python中使用正则表达式精准匹配IP地址的案例

《Python中使用正则表达式精准匹配IP地址的案例》Python的正则表达式(re模块)是完成这个任务的利器,但你知道怎么写才能准确匹配各种合法的IP地址吗,今天我们就来详细探讨这个问题,感兴趣的朋... 目录为什么需要IP正则表达式?IP地址的基本结构基础正则表达式写法精确匹配0-255的数字验证IP地

使用Python实现全能手机虚拟键盘的示例代码

《使用Python实现全能手机虚拟键盘的示例代码》在数字化办公时代,你是否遇到过这样的场景:会议室投影电脑突然键盘失灵、躺在沙发上想远程控制书房电脑、或者需要给长辈远程协助操作?今天我要分享的Pyth... 目录一、项目概述:不止于键盘的远程控制方案1.1 创新价值1.2 技术栈全景二、需求实现步骤一、需求

Python 迭代器和生成器概念及场景分析

《Python迭代器和生成器概念及场景分析》yield是Python中实现惰性计算和协程的核心工具,结合send()、throw()、close()等方法,能够构建高效、灵活的数据流和控制流模型,这... 目录迭代器的介绍自定义迭代器省略的迭代器生产器的介绍yield的普通用法yield的高级用法yidle

使用Python将JSON,XML和YAML数据写入Excel文件

《使用Python将JSON,XML和YAML数据写入Excel文件》JSON、XML和YAML作为主流结构化数据格式,因其层次化表达能力和跨平台兼容性,已成为系统间数据交换的通用载体,本文将介绍如何... 目录如何使用python写入数据到Excel工作表用Python导入jsON数据到Excel工作表用

Python基础语法中defaultdict的使用小结

《Python基础语法中defaultdict的使用小结》Python的defaultdict是collections模块中提供的一种特殊的字典类型,它与普通的字典(dict)有着相似的功能,本文主要... 目录示例1示例2python的defaultdict是collections模块中提供的一种特殊的字

利用Python快速搭建Markdown笔记发布系统

《利用Python快速搭建Markdown笔记发布系统》这篇文章主要为大家详细介绍了使用Python生态的成熟工具,在30分钟内搭建一个支持Markdown渲染、分类标签、全文搜索的私有化知识发布系统... 目录引言:为什么要自建知识博客一、技术选型:极简主义开发栈二、系统架构设计三、核心代码实现(分步解析

基于Python实现高效PPT转图片工具

《基于Python实现高效PPT转图片工具》在日常工作中,PPT是我们常用的演示工具,但有时候我们需要将PPT的内容提取为图片格式以便于展示或保存,所以本文将用Python实现PPT转PNG工具,希望... 目录1. 概述2. 功能使用2.1 安装依赖2.2 使用步骤2.3 代码实现2.4 GUI界面3.效

Python获取C++中返回的char*字段的两种思路

《Python获取C++中返回的char*字段的两种思路》有时候需要获取C++函数中返回来的不定长的char*字符串,本文小编为大家找到了两种解决问题的思路,感兴趣的小伙伴可以跟随小编一起学习一下... 有时候需要获取C++函数中返回来的不定长的char*字符串,目前我找到两种解决问题的思路,具体实现如下:

python连接本地SQL server详细图文教程

《python连接本地SQLserver详细图文教程》在数据分析领域,经常需要从数据库中获取数据进行分析和处理,下面:本文主要介绍python连接本地SQLserver的相关资料,文中通过代码... 目录一.设置本地账号1.新建用户2.开启双重验证3,开启TCP/IP本地服务二js.python连接实例1.

基于Python和MoviePy实现照片管理和视频合成工具

《基于Python和MoviePy实现照片管理和视频合成工具》在这篇博客中,我们将详细剖析一个基于Python的图形界面应用程序,该程序使用wxPython构建用户界面,并结合MoviePy、Pill... 目录引言项目概述代码结构分析1. 导入和依赖2. 主类:PhotoManager初始化方法:__in