七、怎么改变表格的布局
import numpy
表格行排序
1、我想根据乘客年龄(Age)对泰坦尼克号数据进行排序
"Age").head(
| PassengerId | Survived | Pclass | Name | Sex | Age | SibSp | Parch | Ticket | Fare | Cabin | Embarked |
---|
803 | 804 | 1 | 3 | Thomas, Master. Assad Alexander | male | 0.42 | 0 | 1 | 2625 | 8.5167 | NaN | C |
---|
755 | 756 | 1 | 2 | Hamalainen, Master. Viljo | male | 0.67 | 1 | 1 | 250649 | 14.5000 | NaN | S |
---|
644 | 645 | 1 | 3 | Baclini, Miss. Eugenie | female | 0.75 | 2 | 1 | 2666 | 19.2583 | NaN | C |
---|
2、我想根据坐舱等级(Pclass)和年龄(Age)进行降序排列
'Pclass',
| PassengerId | Survived | Pclass | Name | Sex | Age | SibSp | Parch | Ticket | Fare | Cabin | Embarked |
---|
851 | 852 | 0 | 3 | Svensson, Mr. Johan | male | 74.0 | 0 | 0 | 347060 | 7.775 | NaN | S |
---|
116 | 117 | 0 | 3 | Connors, Mr. Patrick | male | 70.5 | 0 | 0 | 370369 | 7.750 | NaN | Q |
---|
280 | 281 | 0 | 3 | Duane, Mr. Frank | male | 65.0 | 0 | 0 | 336439 | 7.750 | NaN | Q |
---|
使用sort_values( )可以根据要求的列(by参数)进行排序(默认行排序,axis参数)。
除了值排序还有索引排序sort_index( ),除了没有by参数,其余功能和sort_values()差不多。
长表格向宽表格转换
这里我们使用空气质量数据集的一部分。我们只提取数据,并只使用每个数据站的前两个测量值。我们假设这个小数据集叫no2_subset。
'parameter'] ==
| city | country | location | parameter | value | unit |
---|
date.utc | | | | | | |
---|
2019-04-09 01:00:00+00:00 | Antwerpen | BE | BETR801 | no2 | 22.5 | µg/m³ |
---|
2019-04-09 01:00:00+00:00 | Paris | FR | FR04014 | no2 | 24.4 | µg/m³ |
---|
2019-04-09 02:00:00+00:00 | London | GB | London Westminster | no2 | 67.0 | µg/m³ |
---|
2019-04-09 02:00:00+00:00 | Antwerpen | BE | BETR801 | no2 | 53.5 | µg/m³ |
---|
2019-04-09 02:00:00+00:00 | Paris | FR | FR04014 | no2 | 27.4 | µg/m³ |
---|
2019-04-09 03:00:00+00:00 | London | GB | London Westminster | no2 | 67.0 | µg/m³ |
---|
3、我想将三个城市分成三个独立列进行浓度数据展示
"city", values=
city | Antwerpen | London | Paris |
---|
date.utc | | | |
---|
2019-04-09 01:00:00+00:00 | 22.5 | NaN | 24.4 |
---|
2019-04-09 02:00:00+00:00 | 53.5 | 67.0 | 27.4 |
---|
2019-04-09 03:00:00+00:00 | NaN | 67.0 | NaN |
---|
pivot()方法以及pivot_table()方法可以转换数据的展示形式:将index/column变换为某一列的各值(有点像Excel的数据透视表)。这两个方法区别在于pivot_table是通用方法,可以对其余数据进行汇总运算;而pivot方法则仅是转变了展示形式,并不对数据做任何处理。
(这节重点展示pivot的方法,下节我们展示pivot_table的方法。)
'city', values=
有了pivot()方法就可以同时绘制不同的时间序列图形。注意,这里没有给出index的值,它会使用默认数据集的index。下图是我用excel表格数据透视表功能做同样的工作,你可检验一下。
透视表(pivot table)
4、我想在表格中展示每个城市和含量的平均值。
'value', index=
parameter | no2 | pm25 |
---|
city | | |
---|
Antwerpen | 26.950920 | 23.169492 |
---|
London | 29.740050 | 13.443568 |
---|
Paris | 29.374284 | NaN |
---|
再次强调pivot仅将数据重排。当需要将多个数据进行汇总运算时,需要使用pivot_table(),利用aggfuc参数(可以是字符串,也可以是函数对象)传递汇总函数。
pivot表格(透视表)是电子表格软件中的一个众所周知的概念。如果对每个变量的摘要列也感兴趣,请将margin参数设置为True:
"value", index=
parameter | no2 | pm25 | All |
---|
city | | | |
---|
Antwerpen | 26.950920 | 23.169492 | 24.982353 |
---|
London | 29.740050 | 13.443568 | 21.491708 |
---|
Paris | 29.374284 | NaN | 29.374284 |
---|
All | 29.430316 | 14.386849 | 24.222743 |
---|
下图为我用excel表格做的同样功能,可以参考一下。
宽表格转换成长表格
我们从前面创建的宽表格开始:
"city", values=
city | date.utc | Antwerpen | London | Paris |
---|
0 | 2019-04-09 01:00:00+00:00 | 22.5 | NaN | 24.4 |
---|
1 | 2019-04-09 02:00:00+00:00 | 53.5 | 67.0 | 27.4 |
---|
2 | 2019-04-09 03:00:00+00:00 | 54.5 | 67.0 | 34.2 |
---|
3 | 2019-04-09 04:00:00+00:00 | 34.5 | 41.0 | 48.5 |
---|
4 | 2019-04-09 05:00:00+00:00 | 46.5 | 41.0 | 59.5 |
---|
5、我想在一个单列中展示所有测量值(长格式)
'date.utc')
| date.utc | city | value |
---|
0 | 2019-04-09 01:00:00+00:00 | Antwerpen | 22.5 |
---|
1 | 2019-04-09 02:00:00+00:00 | Antwerpen | 53.5 |
---|
2 | 2019-04-09 03:00:00+00:00 | Antwerpen | 54.5 |
---|
3 | 2019-04-09 04:00:00+00:00 | Antwerpen | 34.5 |
---|
4 | 2019-04-09 05:00:00+00:00 | Antwerpen | 46.5 |
---|
melt()方法可将数据表格从宽格式转换成长格式,并将所有值合成一个新列中。这个方法把除id_vars参数指定列以外的各列融合(melt)成两列:一列是包含原标题行的各名字(如上面的city);另一列则是数值本身,并且其列名为value。你也可以提供更多细节参数
"date.utc",
| date.utc | city_name | NO_2 |
---|
0 | 2019-04-09 01:00:00+00:00 | Antwerpen | 22.5 |
---|
1 | 2019-04-09 02:00:00+00:00 | Antwerpen | 53.5 |
---|
2 | 2019-04-09 03:00:00+00:00 | Antwerpen | 54.5 |
---|
3 | 2019-04-09 04:00:00+00:00 | Antwerpen | 34.5 |
---|
4 | 2019-04-09 05:00:00+00:00 | Antwerpen | 46.5 |
---|
结果是一样的,但是定义了更多细节:
- value_vars定义了需要融合的列
- value_name定义了数值的新列名用以取代默认列名value。
- var_name定义了标题行形成列的列名,否则它将取原数据index的名字或者取名variable。
因此,var_name和value_name给出了两个生成列的列名,id_vars和value_vars指出了哪些列需要融合。
---------------分割线------------------
交叉表(Cross tabulations)
使用crosstab()可以计算两个或多个因子变量之间的交差表。通常情况下crosstab是计算因子出现的频数,除非给定汇总函数。
'A': [
| A | B | C |
---|
0 | 1 | 3 | 1.0 |
---|
1 | 2 | 3 | 1.0 |
---|
2 | 2 | 4 | NaN |
---|
3 | 2 | 4 | 1.0 |
---|
4 | 2 | 4 | 1.0 |
---|
'A'], df[
'A'], df[
'A'], df[
'A'], df[
'A'], df[
--------------------------------------------------------------------------------------------------
八、怎么将多个表格合成一个表格
import pandas
| date.utc | city | location | parameter | value |
---|
0 | 2019-06-21 00:00:00+00:00 | Paris | FR04014 | no2 | 20.0 |
---|
1 | 2019-06-20 23:00:00+00:00 | Paris | FR04014 | no2 | 21.8 |
---|
2 | 2019-06-20 22:00:00+00:00 | Paris | FR04014 | no2 | 26.5 |
---|
'./data/air_quality_pm25_long.csv',
| date.utc | city | location | parameter | value |
---|
0 | 2019-06-18 06:00:00+00:00 | Antwerpen | BETR801 | pm25 | 18.0 |
---|
1 | 2019-06-17 08:00:00+00:00 | Antwerpen | BETR801 | pm25 | 6.5 |
---|
2 | 2019-06-17 07:00:00+00:00 | Antwerpen | BETR801 | pm25 | 18.5 |
---|
连接(concatenate)对象
1、我想把两个结构相似的和的测量值组合起来形成一个表格。
0)
| date.utc | city | location | parameter | value |
---|
0 | 2019-06-18 06:00:00+00:00 | Antwerpen | BETR801 | pm25 | 18.0 |
---|
1 | 2019-06-17 08:00:00+00:00 | Antwerpen | BETR801 | pm25 | 6.5 |
---|
2 | 2019-06-17 07:00:00+00:00 | Antwerpen | BETR801 | pm25 | 18.5 |
---|
3)
| date.utc | city | location | parameter | value |
---|
3444 | 2019-04-09 04:00:00+00:00 | London | London Westminster | no2 | 41.0 |
---|
3445 | 2019-04-09 03:00:00+00:00 | London | London Westminster | no2 | 67.0 |
---|
3446 | 2019-04-09 02:00:00+00:00 | London | London Westminster | no2 | 67.0 |
---|
concat()函数将多个表格沿某个轴连接起来(axis=0,按行;axis=1,按列)。默认情况下,连接是沿0轴进行的,因此生成的表合并了输入表的行。
这个例子中,parameter列的值刚好可以标识数此条数据来自哪个数据集。但大多数情况不并不会这样,因此cocat函数提供了一个便捷的解决方法,就是采用keys参数,这会增一个额外的行索引。例如:
air_quality_ = pd.concat([air_quality_pm25, air_quality_no2],
keys=['PM25', 'NO2'])
air_quality_.head(3)
| | date.utc | city | location | parameter | value |
---|
PM25 | 0 | 2019-06-18 06:00:00+00:00 | Antwerpen | BETR801 | pm25 | 18.0 |
---|
1 | 2019-06-17 08:00:00+00:00 | Antwerpen | BETR801 | pm25 | 6.5 |
---|
2 | 2019-06-17 07:00:00+00:00 | Antwerpen | BETR801 | pm25 | 18.5 |
---|
3)
| | date.utc | city | location | parameter | value |
---|
NO2 | 3444 | 2019-04-09 04:00:00+00:00 | London | London Westminster | no2 | 41.0 |
---|
3445 | 2019-04-09 03:00:00+00:00 | London | London Westminster | no2 | 67.0 |
---|
3446 | 2019-04-09 02:00:00+00:00 | London | London Westminster | no2 | 67.0 |
---|
使用相同标识将表格连接起来
2、我想使用监测站(station)信息表格为空气质量数据添加站点经纬度。
"./data/air_quality_stations.csv")
| location | coordinates.latitude | coordinates.longitude |
---|
0 | BELAL01 | 51.23619 | 4.38522 |
---|
1 | BELHB23 | 51.17030 | 4.34100 |
---|
2 | BELLD01 | 51.10998 | 5.00486 |
---|
3 | BELLD02 | 51.12038 | 5.02155 |
---|
4 | BELR833 | 51.32766 | 4.36226 |
---|
空气质量数据里使用的站点(FR04014、BETR801和London-Westminster)信息只是此表中的三个条目。我们只想将这三个坐标添加到空气质量数据表对应行上。
0)
| date.utc | city | location | parameter | value |
---|
1675 | 2019-04-09 01:00:00+00:00 | Paris | FR04014 | no2 | 24.4 |
---|
176 | 2019-04-09 01:00:00+00:00 | Antwerpen | BETR801 | pm25 | 76.0 |
---|
1838 | 2019-04-09 01:00:00+00:00 | Antwerpen | BETR801 | no2 | 22.5 |
---|
3446 | 2019-04-09 02:00:00+00:00 | London | London Westminster | no2 | 67.0 |
---|
1674 | 2019-04-09 02:00:00+00:00 | Paris | FR04014 | no2 | 27.4 |
---|
air_quality = pd.merge(air_quality, stations_coord,
how='left', on='location')
air_quality.head()
| date.utc | city | location | parameter | value | coordinates.latitude | coordinates.longitude |
---|
0 | 2019-04-09 01:00:00+00:00 | Paris | FR04014 | no2 | 24.4 | 48.83722 | 2.39390 |
---|
1 | 2019-04-09 01:00:00+00:00 | Paris | FR04014 | no2 | 24.4 | 48.83724 | 2.39390 |
---|
2 | 2019-04-09 01:00:00+00:00 | Antwerpen | BETR801 | pm25 | 76.0 | 51.20966 | 4.43182 |
---|
3 | 2019-04-09 01:00:00+00:00 | Antwerpen | BETR801 | no2 | 22.5 | 51.20966 | 4.43182 |
---|
4 | 2019-04-09 02:00:00+00:00 | London | London Westminster | no2 | 67.0 | 51.49467 | -0.13193 |
---|
使用merge()函数,为air_quality表中的每一行添加air_quality_stations_coord表中的相应坐标。两个表都有一个共同的列location,该列用作组合两个表格的key。通过选择left左连接,只有空气质量 air_quality(左)表中的location(即FR04014、BETR801和London Westminster)才会出现在生成的表中。merge函数支持多个连接选项,类似于数据库的操作方式。
3、我想用参数(parameters)信息表格更新空气质量表格的参数描述和名字。
"./data/air_quality_parameters.csv")
| id | description | name |
---|
0 | bc | Black Carbon | BC |
---|
1 | co | Carbon Monoxide | CO |
---|
2 | no2 | Nitrogen Dioxide | NO2 |
---|
3 | o3 | Ozone | O3 |
---|
4 | pm10 | Particulate matter less than 10 micrometers in... | PM10 |
---|
5 | pm25 | Particulate matter less than 2.5 micrometers i... | PM2.5 |
---|
6 | so2 | Sulfur Dioxide | SO2 |
---|
0)
| date.utc | city | location | parameter | value | id | description | name |
---|
0 | 2019-04-09 01:00:00+00:00 | Paris | FR04014 | no2 | 24.4 | no2 | Nitrogen Dioxide | NO2 |
---|
1 | 2019-04-09 01:00:00+00:00 | Antwerpen | BETR801 | pm25 | 76.0 | pm25 | Particulate matter less than 2.5 micrometers i... | PM2.5 |
---|
2 | 2019-04-09 01:00:00+00:00 | Antwerpen | BETR801 | no2 | 22.5 | no2 | Nitrogen Dioxide | NO2 |
---|
3 | 2019-04-09 02:00:00+00:00 | London | London Westminster | no2 | 67.0 | no2 | Nitrogen Dioxide | NO2 |
---|
4 | 2019-04-09 02:00:00+00:00 | Paris | FR04014 | no2 | 27.4 | no2 | Nitrogen Dioxide | NO2 |
---|
与前面的例子相比,没有共同的列名。但是,air_quality表中的parameter列和air_quality_parameters中的id列变量格式相同。这里使用left_on和right_on参数(而不使用on)在两个表之间建立联系。
---------------分割线-------------------
除了上面提到的两种组合方法,还有一种可以把两个不同index的DataFrame组合成一个的方法join(),join方法的功能比较简单:把两个数据index组合起来;或者将一个数据的index连接到另一个数据的某列上。
'A': [
'C': [
# 默认左数据的index
| A | B | C | D |
---|
K0 | A0 | B0 | C0 | D0 |
---|
K1 | A1 | B1 | NaN | NaN |
---|
K2 | A2 | B2 | C2 | D2 |
---|
'outer')
| A | B | C | D |
---|
K0 | A0 | B0 | C0 | D0 |
---|
K1 | A1 | B1 | NaN | NaN |
---|
K2 | A2 | B2 | C2 | D2 |
---|
K3 | NaN | NaN | C3 | D3 |
---|
'inner')
'A': [
| A | B | key |
---|
0 | A0 | B0 | K0 |
---|
1 | A1 | B1 | K1 |
---|
2 | A2 | B2 | K0 |
---|
3 | A3 | B3 | K1 |
---|
'C': [
'key')
| A | B | key | C | D |
---|
0 | A0 | B0 | K0 | C0 | D0 |
---|
1 | A1 | B1 | K1 | C1 | D1 |
---|
2 | A2 | B2 | K0 | C0 | D0 |
---|
3 | A3 | B3 | K1 | C1 | D1 |
---|
join方法一般用merge都可以实现,但merge的用法相关复杂,灵活运用join可以简化表达。