笔记——pandas学习2

在pandas中创建图像

import pandas as pd
import matplotlib.pyplot as plt

1. 使用空气质量数据air_quality_no2.csv

数据下载

air_quality=pd.read_csv("data/air_quality_no2.csv",index_col=0,parse_dates=True)
air_quality.head()
#index_col=0,parse_dates=True表示把返回的表格的第一列作为索引,
#把列中的数组转化为Timestamp
station_antwerpstation_parisstation_london
datetime
2019-05-07 02:00:00NaNNaN23.0
2019-05-07 03:00:0050.525.019.0
2019-05-07 04:00:0045.027.719.0
2019-05-07 05:00:00NaN50.416.0
2019-05-07 06:00:00NaN61.9NaN

2. 可视化数据

plt.plot(air_quality)
[<matplotlib.lines.Line2D at 0x227a8689488>,
 <matplotlib.lines.Line2D at 0x227a91e7608>,
 <matplotlib.lines.Line2D at 0x227a91e7688>]

在这里插入图片描述

air_quality.plot()
<matplotlib.axes._subplots.AxesSubplot at 0x227a80e86c8>

在这里插入图片描述

2. visually compare the N02 values measured in London versus Paris.

air_quality.plot.scatter(x="station_london",y="station_paris",alpha=0.5)#alpha表示透明度
<matplotlib.axes._subplots.AxesSubplot at 0x227ab575848>

在这里插入图片描述

plt.scatter(air_quality["station_london"],air_quality["station_paris"] ,alpha=0.2)
<matplotlib.collections.PathCollection at 0x227a96d3388>

在这里插入图片描述

3.一些标准的Python来概述可用的绘图方法:

[method_name for method_name in dir(air_quality.plot) if not method_name.startswith("_")]
['area',
 'bar',
 'barh',
 'box',
 'density',
 'hexbin',
 'hist',
 'kde',
 'line',
 'pie',
 'scatter']

注意

在许多开发环境比如ipython和jupyter nootbook,请使用TAB按钮获得全部的可用方法,例如air_quality.plot.+ TAB。

air_quality.plot.box()
<matplotlib.axes._subplots.AxesSubplot at 0x227ac9382c8>

在这里插入图片描述

4.每个列在单独的子图中:subplots

axs=air_quality.plot.area(figsize=(12,4),subplots=True)

在这里插入图片描述

5.进一步自定义,扩展或保存生成的图。

fig, axs = plt.subplots(figsize=(12, 4))        # Create an empty matplotlib Figure and Axes
air_quality.plot.area(ax=axs)                   # Use pandas to put the area plot on the prepared Figure/Axes
axs.set_ylabel("NO$_2$ concentration")          # Do any matplotlib customization you like
fig.savefig("no2_concentrations.png")           # Save the Figure/Axes using the existing matplotlib method.

在这里插入图片描述

小结:

  1. 该.plot.*方法适用于Series和DataFrames

  2. 默认情况下,每个列都用不同的元素(线,箱线图等)绘制

  3. pandas创建的任何plot都是Matplotlib对象。

从现有列派生出新的列

#表达 NO2 伦敦车站的浓度,mg / m3
#(如果我们假设温度为25摄氏度,压力为1013 hPa,则转换因子为1.882)

air_quality["londom-mg_per_cubic"]=air_quality["station_london"]*1.882
air_quality.head()
station_antwerpstation_parisstation_londonlondom-mg_per_cubic
datetime
2019-05-07 02:00:00NaNNaN23.043.286
2019-05-07 03:00:0050.525.019.035.758
2019-05-07 04:00:0045.027.719.035.758
2019-05-07 05:00:00NaN50.416.030.112
2019-05-07 06:00:00NaN61.9NaNNaN
#求巴黎与安特卫普的值之比,并将结果保存在新列中
air_quality["ratio_paris_anwerp"]=air_quality["station_paris"]/air_quality["station_antwerp"]
air_quality.head()
station_antwerpstation_parisstation_londonlondom-mg_per_cubicratio_paris_anwerp
datetime
2019-05-07 02:00:00NaNNaN23.043.286NaN
2019-05-07 03:00:0050.525.019.035.7580.495050
2019-05-07 04:00:0045.027.719.035.7580.615556
2019-05-07 05:00:00NaN50.416.030.112NaN
2019-05-07 06:00:00NaN61.9NaNNaNNaN

rename()

  1. 可用于行标签和列标签。
  2. 提供一个字典,其中包含键,当前名称和值,以及新名称.
#将数据列重命名为openAQ使用的相应工作站标识符werp
air_quality_renamed=air_quality.rename(columns={
    "station_anterp":"BETR801",
    "staion_paris":"FR04014",
    "staion_london":"London Westminster"})
air_quality_renamed.head()
station_antwerpstation_parisstation_londonlondom-mg_per_cubicratio_paris_anwerp
datetime
2019-05-07 02:00:00NaNNaN23.043.286NaN
2019-05-07 03:00:0050.525.019.035.7580.495050
2019-05-07 04:00:0045.027.719.035.7580.615556
2019-05-07 05:00:00NaN50.416.030.112NaN
2019-05-07 06:00:00NaN61.9NaNNaNNaN
# rename()映射不仅应限于固定名称,还可以是映射函数

air_quality_renamed=air_quality.rename(columns=str.lower)#将列名转为小写
air_quality_renamed.head()
station_antwerpstation_parisstation_londonlondom-mg_per_cubicratio_paris_anwerp
datetime
2019-05-07 02:00:00NaNNaN23.043.286NaN
2019-05-07 03:00:0050.525.019.035.7580.495050
2019-05-07 04:00:0045.027.719.035.7580.615556
2019-05-07 05:00:00NaN50.416.030.112NaN
2019-05-07 06:00:00NaN61.9NaNNaNNaN

小结:

  1. 创建新列:把基于现有列的计算结果赋值给[]中的新列名。

  2. 操作是基于元素的,不需要遍历行。

  3. rename与字典或函数一起使用来重命名行标签或列名。

计算汇总统计信息

titanic=pd.read_csv("data/titanic.csv")
titanic.head()
PassengerIdSurvivedPclassNameSexAgeSibSpParchTicketFareCabinEmbarked
0103Braund, Mr. Owen Harrismale22.010A/5 211717.2500NaNS
1211Cumings, Mrs. John Bradley (Florence Briggs Th...female38.010PC 1759971.2833C85C
2313Heikkinen, Miss. Lainafemale26.000STON/O2. 31012827.9250NaNS
3411Futrelle, Mrs. Jacques Heath (Lily May Peel)female35.01011380353.1000C123S
4503Allen, Mr. William Henrymale35.0003734508.0500NaNS

1.平均数

#泰坦尼克号旅客的平均年龄
titanic["Age"].mean()
29.69911764705882

2. 中位数

titanic[["Age","Fare"]].median()
Age     28.0000
Fare    14.4542
dtype: float64
titanic[["Age","Fare"]].describe()
AgeFare
count714.000000891.000000
mean29.69911832.204208
std14.52649749.693429
min0.4200000.000000
25%20.1250007.910400
50%28.00000014.454200
75%38.00000031.000000
max80.000000512.329200

3. DataFrame.agg()

使用指定轴上的一项或多项操作进行汇总

titanic.agg({'Age':['min','max','median','skew'],
             'Fare':['min','max','median','mean']})
AgeFare
max80.000000512.329200
meanNaN32.204208
median28.00000014.454200
min0.4200000.000000
skew0.389108NaN

4.groupby():按类别分组

  1. 获取按类别(属性)分组的统计信息
  2. 分组可以同时由多个列完成。提供列名作为groupby()方法的列表
#男性和女性泰坦尼克号乘客的平均年龄
titanic[["Sex","Age"]].groupby('Sex').mean()
Age
Sex
female27.915709
male30.726645
titanic.groupby('Sex').mean()
PassengerIdSurvivedPclassAgeSibSpParchFare
Sex
female431.0286620.7420382.15923627.9157090.6942680.64968244.479818
male454.1473140.1889082.38994830.7266450.4298090.23570225.523893
#我们只对每种性别的平均年龄感兴趣
titanic.groupby('Sex')['Age'].mean()
Sex
female    27.915709
male      30.726645
Name: Age, dtype: float64
#性别和客舱舱位组合的平均票价
titanic.groupby(['Sex','Pclass'])['Fare'].mean()
Sex     Pclass
female  1         106.125798
        2          21.970121
        3          16.118810
male    1          67.226127
        2          19.741782
        3          12.661633
Name: Fare, dtype: float64

5.value_counts():按类别统计数目

#每个舱位的乘客人数
titanic['Pclass'].value_counts()
3    491
1    216
2    184
Name: Pclass, dtype: int64
#它实际上是一个groupby操作,结合了对每个组中记录数的计数
titanic.groupby('Pclass')['Pclass'].count()
Pclass
1    216
2    184
3    491
Name: Pclass, dtype: int64

注意:

  1. size()和count()都可以和groupby()一起用
  2. size包括NaN(size of the table)
  3. count排除了缺省值
  4. value_counts()可以使用drapna()去增/去 Nan

小结:

  1. 可以对整列或整行计算聚合统计信息

  2. groupby提供 拆分-应用-组合 模式的功能

  3. value_counts 是一种方便的快捷方式,用于计算每个类别中的条目数

对表格进行重新布局

1. 对表格进行排序

  • 使用.sort_values(),将根据定义的列对表中的行进行排序。索引将遵循行顺序。
 #根据乘客的年龄对泰坦尼克号数据进行排序。
titanic.sort_values(by='Age').head()
PassengerIdSurvivedPclassNameSexAgeSibSpParchTicketFareCabinEmbarked
80380413Thomas, Master. Assad Alexandermale0.420126258.5167NaNC
75575612Hamalainen, Master. Viljomale0.671125064914.5000NaNS
64464513Baclini, Miss. Eugeniefemale0.7521266619.2583NaNC
46947013Baclini, Miss. Helene Barbarafemale0.7521266619.2583NaNC
787912Caldwell, Master. Alden Gatesmale0.830224873829.0000NaNS
#根据机舱等级和年龄按降序对泰坦尼克号数据进行排序
titanic.sort_values(by=["Pclass","Age"],ascending=False).head()
PassengerIdSurvivedPclassNameSexAgeSibSpParchTicketFareCabinEmbarked
85185203Svensson, Mr. Johanmale74.0003470607.7750NaNS
11611703Connors, Mr. Patrickmale70.5003703697.7500NaNQ
28028103Duane, Mr. Frankmale65.0003364397.7500NaNQ
48348413Turkula, Mrs. (Hedwig)female63.00041349.5875NaNS
32632703Nysveen, Mr. Johan Hansenmale61.0003453646.2375NaNS
air_quality=pd.read_csv("data/air_quality_long.csv",index_col="date.utc",parse_dates=True)
air_quality.head()
citycountrylocationparametervalueunit
date.utc
2019-06-18 06:00:00+00:00AntwerpenBEBETR801pm2518.0µg/m³
2019-06-17 08:00:00+00:00AntwerpenBEBETR801pm256.5µg/m³
2019-06-17 07:00:00+00:00AntwerpenBEBETR801pm2518.5µg/m³
2019-06-17 06:00:00+00:00AntwerpenBEBETR801pm2516.0µg/m³
2019-06-17 05:00:00+00:00AntwerpenBEBETR801pm257.5µg/m³

2.长到宽表格式???Long to wide table format

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-MNKpTCte-1595753237357)(attachment:image.png)]

#过滤其他数据只要no2的数据
no2=air_quality[air_quality['parameter']=='no2']
#仅使用每个location(grouupby)的前两个测量值。
no2_subset=no2.sort_index().groupby("location").head(2)
no2_subset
citycountrylocationparametervalueunit
date.utc
2019-04-09 01:00:00+00:00AntwerpenBEBETR801no222.5µg/m³
2019-04-09 01:00:00+00:00ParisFRFR04014no224.4µg/m³
2019-04-09 02:00:00+00:00LondonGBLondon Westminsterno267.0µg/m³
2019-04-09 02:00:00+00:00AntwerpenBEBETR801no253.5µg/m³
2019-04-09 02:00:00+00:00ParisFRFR04014no227.4µg/m³
2019-04-09 03:00:00+00:00LondonGBLondon Westminsterno267.0µg/m³

3.pivot():

该pivot_table()功能纯粹是对数据进行整形:每个索引/列组合都需要一个值。

#将三个工作站的值作为彼此相邻的单独列
no2_subset.pivot(columns="location",values="value")
locationBETR801FR04014London Westminster
date.utc
2019-04-09 01:00:00+00:0022.524.4NaN
2019-04-09 02:00:00+00:0053.527.467.0
2019-04-09 03:00:00+00:00NaNNaN67.0
#由于pandas支持开箱即用的多列绘图,
#从长表格式转换 为宽表格式可以同时绘制不同的时间序列:
no2.head()
citycountrylocationparametervalueunit
date.utc
2019-06-21 00:00:00+00:00ParisFRFR04014no220.0µg/m³
2019-06-20 23:00:00+00:00ParisFRFR04014no221.8µg/m³
2019-06-20 22:00:00+00:00ParisFRFR04014no226.5µg/m³
2019-06-20 21:00:00+00:00ParisFRFR04014no224.9µg/m³
2019-06-20 20:00:00+00:00ParisFRFR04014no221.4µg/m³
no2.pivot(columns='location',values='value').plot()
<matplotlib.axes._subplots.AxesSubplot at 0x227af5abfc8>

在这里插入图片描述

4.透视表:

#想要 NO2 和 PM2.5 的平均浓度以表格形式在每个站中
air_quality.pivot_table(values="value",index="location",columns="parameter",aggfunc="mean")

#当需要汇总多个值时(在这种特定情况下,pivot_table()可以使用不同时间步长的值),
#从而提供如何组合这些值的汇总函数(例如均值)。
parameterno2pm25
location
BETR80126.95092023.169492
FR0401429.374284NaN
London Westminster29.74005013.443568
#果同时对每个变量的摘要列感兴趣,请将margin参数放入True:
air_quality.pivot_table(values="value",index="location",columns="parameter",aggfunc="mean",margins=True)
parameterno2pm25All
location
BETR80126.95092023.16949224.982353
FR0401429.374284NaN29.374284
London Westminster29.74005013.44356821.491708
All29.43031614.38684924.222743
air_quality.groupby(["parameter","location"]).mean()
value
parameterlocation
no2BETR80126.950920
FR0401429.374284
London Westminster29.740050
pm25BETR80123.169492
London Westminster13.443568

5. Wide to long format

  1. pandas.melt()方法DataFrame将数据表从宽格式转换为长格式。
  2. 列标题成为新创建的列中的变量名称。
    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Nqf0iDni-1595753237361)(attachment:image.png)]
#再次从上一部分中创建的宽格式表开始:
no2_pivoted = no2.pivot(columns="location", values="value").reset_index()
no2_pivoted.head()
locationdate.utcBETR801FR04014London Westminster
02019-04-09 01:00:00+00:0022.524.4NaN
12019-04-09 02:00:00+00:0053.527.467.0
22019-04-09 03:00:00+00:0054.534.267.0
32019-04-09 04:00:00+00:0034.548.541.0
42019-04-09 05:00:00+00:0046.559.541.0
#收集所有NO2的测量值到 单列(长格式)
no_2=no2_pivoted.melt(id_vars="date.utc")
no_2.head()
date.utclocationvalue
02019-04-09 01:00:00+00:00BETR80122.5
12019-04-09 02:00:00+00:00BETR80153.5
22019-04-09 03:00:00+00:00BETR80154.5
32019-04-09 04:00:00+00:00BETR80134.5
42019-04-09 05:00:00+00:00BETR80146.5
#所有列id_vars一起为两列:一列与列标题名称,并用这些值本身的列。
#默认情况下,后一列的名称为value。
#pandas.melt()可以更详细地定义该方法:
no_2=no2_pivoted.melt(id_vars="date.utc",
                       value_vars=["BETR801",
                                    "FR04014",
                                    "London Westminster"],
                       value_name="NO_2",
                       var_name="id_location")
no_2.head()
date.utcid_locationNO_2
02019-04-09 01:00:00+00:00BETR80122.5
12019-04-09 02:00:00+00:00BETR80153.5
22019-04-09 03:00:00+00:00BETR80154.5
32019-04-09 04:00:00+00:00BETR80134.5
42019-04-09 05:00:00+00:00BETR80146.5

结果相同,但定义更详细:

  1. value_vars明确定义要融合在一起的列

  2. value_name 提供值列的自定义列名,而不是默认列名 value

  3. var_name为收集列标题名称的列提供自定义列名称。否则,它采用索引名称或默认值variable

  • 因此,参数value_name和var_name是两个生成的列的用户定义名称。要熔化的列由id_vars和定义value_vars。

小结:

  1. 支持按一列或多列排序 sort_values

  2. 该pivot功能是纯粹的数据重组, pivot_table支持聚合

  3. pivot(长到宽格式)的相反是melt(宽到长格式)

这篇笔记主要介绍了Pandas模块的基本操作和使用方法。PandasPython中一个用于数据分析和处理的常用库,提供了高效的数据结构和数据分析工具,是进行数据处理和数据挖掘的重要工具之一。 一、Pandas数据结构 Pandas主要有两种数据结构:Series和DataFrame。 1. Series Series是一种类似于一维数组的对象,由一组数据和一组与之相关的标签(即索引)组成。Series的创建方式如下: ```python import pandas as pd # 通过列表创建Series s = pd.Series([1, 3, 5, np.nan, 6, 8]) # 通过字典创建Series s = pd.Series({'a': 1, 'b': 2, 'c': 3}) ``` 2. DataFrame DataFrame是一种二维表格数据结构,由一组数据和一组行索引和列索引组成。DataFrame的创建方式有很多种,最常用的是通过字典创建。例如: ```python import pandas as pd data = {'name': ['Tom', 'Jerry', 'Mike'], 'age': [18, 20, 22], 'gender': ['M', 'M', 'F']} df = pd.DataFrame(data) ``` 二、Pandas的基本操作 1. 数据读取 Pandas可以读取多种格式的数据文件,如CSV、Excel、SQL等。常用的读取CSV文件的方式如下: ```python import pandas as pd df = pd.read_csv('data.csv') ``` 2. 数据预处理 数据预处理是数据挖掘中非常重要的一部分,Pandas提供了很多方便的函数和方法来进行数据清洗和转换。常用的数据预处理函数和方法有: - 处理缺失值 ```python # 判断是否存在缺失值 df.isnull() # 删除缺失值 df.dropna() # 填充缺失值 df.fillna(value) ``` - 处理重复值 ```python # 删除重复值 df.drop_duplicates() ``` - 数据转换 ```python # 数据类型转换 df.astype() # 数据替换 df.replace() ``` 3. 数据分析 Pandas提供了各种数据分析和处理的方法和函数,常用的包括: - 统计函数 ```python # 计算平均值 df.mean() # 计算标准差 df.std() # 计算最大值和最小值 df.max(), df.min() ``` - 排序 ```python # 按照某列排序 df.sort_values(by='column_name') ``` - 数据聚合 ```python # 对某列数据进行分组求和 df.groupby('column_name').sum() ``` 以上是Pandas模块的基础内容,还有很多高级用法和技巧需要进一步学习和掌握。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值