alter table add column多个字段_pandas使用7+8:怎么改变表格的布局+怎么将多个表格合成一个表格...

七、怎么改变表格的布局

import numpy 

表格行排序

1、我想根据乘客年龄(Age)对泰坦尼克号数据进行排序

"Age").head(
PassengerIdSurvivedPclassNameSexAgeSibSpParchTicketFareCabinEmbarked
80380413Thomas, Master. Assad Alexandermale0.420126258.5167NaNC
75575612Hamalainen, Master. Viljomale0.671125064914.5000NaNS
64464513Baclini, Miss. Eugeniefemale0.7521266619.2583NaNC

2、我想根据坐舱等级(Pclass)和年龄(Age)进行降序排列

'Pclass',
PassengerIdSurvivedPclassNameSexAgeSibSpParchTicketFareCabinEmbarked
85185203Svensson, Mr. Johanmale74.0003470607.775NaNS
11611703Connors, Mr. Patrickmale70.5003703697.750NaNQ
28028103Duane, Mr. Frankmale65.0003364397.750NaNQ

使用sort_values( )可以根据要求的列(by参数)进行排序(默认行排序,axis参数)。

除了值排序还有索引排序sort_index( ),除了没有by参数,其余功能和sort_values()差不多。

长表格向宽表格转换

这里我们使用空气质量数据集的一部分。我们只提取数据,并只使用每个数据站的前两个测量值。我们假设这个小数据集叫no2_subset。

'parameter'] == 
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、我想将三个城市分成三个独立列进行浓度数据展示

"city", values=
cityAntwerpenLondonParis
date.utc
2019-04-09 01:00:00+00:0022.5NaN24.4
2019-04-09 02:00:00+00:0053.567.027.4
2019-04-09 03:00:00+00:00NaN67.0NaN

pivot()方法以及pivot_table()方法可以转换数据的展示形式:将index/column变换为某一列的各值(有点像Excel的数据透视表)。这两个方法区别在于pivot_table是通用方法,可以对其余数据进行汇总运算;而pivot方法则仅是转变了展示形式,并不对数据做任何处理。

(这节重点展示pivot的方法,下节我们展示pivot_table的方法。)

'city', values=

bdd65748bcb7bfadc5b7c77e9462fd7d.png

有了pivot()方法就可以同时绘制不同的时间序列图形。注意,这里没有给出index的值,它会使用默认数据集的index。下图是我用excel表格数据透视表功能做同样的工作,你可检验一下。

2bb98baabf662174405a583aea7b98f4.png

透视表(pivot table)

4、我想在表格中展示每个城市和含量的平均值。

'value', index=
parameterno2pm25
city
Antwerpen26.95092023.169492
London29.74005013.443568
Paris29.374284NaN

再次强调pivot仅将数据重排。当需要将多个数据进行汇总运算时,需要使用pivot_table(),利用aggfuc参数(可以是字符串,也可以是函数对象)传递汇总函数。

pivot表格(透视表)是电子表格软件中的一个众所周知的概念。如果对每个变量的摘要列也感兴趣,请将margin参数设置为True:

"value", index=
parameterno2pm25All
city
Antwerpen26.95092023.16949224.982353
London29.74005013.44356821.491708
Paris29.374284NaN29.374284
All29.43031614.38684924.222743

下图为我用excel表格做的同样功能,可以参考一下。

d98247f7c6599ea00100a470aa09f249.png

宽表格转换成长表格

我们从前面创建的宽表格开始:

"city", values=
citydate.utcAntwerpenLondonParis
02019-04-09 01:00:00+00:0022.5NaN24.4
12019-04-09 02:00:00+00:0053.567.027.4
22019-04-09 03:00:00+00:0054.567.034.2
32019-04-09 04:00:00+00:0034.541.048.5
42019-04-09 05:00:00+00:0046.541.059.5


5、我想在一个单列中展示所有测量值(长格式)

'date.utc')
date.utccityvalue
02019-04-09 01:00:00+00:00Antwerpen22.5
12019-04-09 02:00:00+00:00Antwerpen53.5
22019-04-09 03:00:00+00:00Antwerpen54.5
32019-04-09 04:00:00+00:00Antwerpen34.5
42019-04-09 05:00:00+00:00Antwerpen46.5

melt()方法可将数据表格从宽格式转换成长格式,并将所有值合成一个新列中。这个方法把除id_vars参数指定列以外的各列融合(melt)成两列:一列是包含原标题行的各名字(如上面的city);另一列则是数值本身,并且其列名为value。你也可以提供更多细节参数

"date.utc",
date.utccity_nameNO_2
02019-04-09 01:00:00+00:00Antwerpen22.5
12019-04-09 02:00:00+00:00Antwerpen53.5
22019-04-09 03:00:00+00:00Antwerpen54.5
32019-04-09 04:00:00+00:00Antwerpen34.5
42019-04-09 05:00:00+00:00Antwerpen46.5

结果是一样的,但是定义了更多细节:

  • value_vars定义了需要融合的列
  • value_name定义了数值的新列名用以取代默认列名value。
  • var_name定义了标题行形成列的列名,否则它将取原数据index的名字或者取名variable。

因此,var_namevalue_name给出了两个生成列的列名,id_varsvalue_vars指出了哪些列需要融合。

---------------分割线------------------

交叉表(Cross tabulations)

使用crosstab()可以计算两个或多个因子变量之间的交差表。通常情况下crosstab是计算因子出现的频数,除非给定汇总函数。

'A': [
ABC
0131.0
1231.0
224NaN
3241.0
4241.0
'A'], df[
B34
A
110
213
'A'], df[
B34
A
10.20.0
20.20.6
'A'], df[
B34
A
10.50.0
20.51.0
'A'], df[
B34
A
11.0NaN
21.02.0
'A'], df[
B34All
A
1101
2134
All235
--------------------------------------------------------------------------------------------------

八、怎么将多个表格合成一个表格

import pandas 
date.utccitylocationparametervalue
02019-06-21 00:00:00+00:00ParisFR04014no220.0
12019-06-20 23:00:00+00:00ParisFR04014no221.8
22019-06-20 22:00:00+00:00ParisFR04014no226.5
'./data/air_quality_pm25_long.csv', 
date.utccitylocationparametervalue
02019-06-18 06:00:00+00:00AntwerpenBETR801pm2518.0
12019-06-17 08:00:00+00:00AntwerpenBETR801pm256.5
22019-06-17 07:00:00+00:00AntwerpenBETR801pm2518.5

连接(concatenate)对象

image.png

1、我想把两个结构相似的和的测量值组合起来形成一个表格。

0)
date.utccitylocationparametervalue
02019-06-18 06:00:00+00:00AntwerpenBETR801pm2518.0
12019-06-17 08:00:00+00:00AntwerpenBETR801pm256.5
22019-06-17 07:00:00+00:00AntwerpenBETR801pm2518.5
3)
date.utccitylocationparametervalue
34442019-04-09 04:00:00+00:00LondonLondon Westminsterno241.0
34452019-04-09 03:00:00+00:00LondonLondon Westminsterno267.0
34462019-04-09 02:00:00+00:00LondonLondon Westminsterno267.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.utccitylocationparametervalue
PM2502019-06-18 06:00:00+00:00AntwerpenBETR801pm2518.0
12019-06-17 08:00:00+00:00AntwerpenBETR801pm256.5
22019-06-17 07:00:00+00:00AntwerpenBETR801pm2518.5
3)
date.utccitylocationparametervalue
NO234442019-04-09 04:00:00+00:00LondonLondon Westminsterno241.0
34452019-04-09 03:00:00+00:00LondonLondon Westminsterno267.0
34462019-04-09 02:00:00+00:00LondonLondon Westminsterno267.0

使用相同标识将表格连接起来

image.png

2、我想使用监测站(station)信息表格为空气质量数据添加站点经纬度。

"./data/air_quality_stations.csv")
locationcoordinates.latitudecoordinates.longitude
0BELAL0151.236194.38522
1BELHB2351.170304.34100
2BELLD0151.109985.00486
3BELLD0251.120385.02155
4BELR83351.327664.36226

空气质量数据里使用的站点(FR04014、BETR801和London-Westminster)信息只是此表中的三个条目。我们只想将这三个坐标添加到空气质量数据表对应行上。

0)
date.utccitylocationparametervalue
16752019-04-09 01:00:00+00:00ParisFR04014no224.4
1762019-04-09 01:00:00+00:00AntwerpenBETR801pm2576.0
18382019-04-09 01:00:00+00:00AntwerpenBETR801no222.5
34462019-04-09 02:00:00+00:00LondonLondon Westminsterno267.0
16742019-04-09 02:00:00+00:00ParisFR04014no227.4
air_quality = pd.merge(air_quality, stations_coord,
                       how='left', on='location')
air_quality.head()
date.utccitylocationparametervaluecoordinates.latitudecoordinates.longitude
02019-04-09 01:00:00+00:00ParisFR04014no224.448.837222.39390
12019-04-09 01:00:00+00:00ParisFR04014no224.448.837242.39390
22019-04-09 01:00:00+00:00AntwerpenBETR801pm2576.051.209664.43182
32019-04-09 01:00:00+00:00AntwerpenBETR801no222.551.209664.43182
42019-04-09 02:00:00+00:00LondonLondon Westminsterno267.051.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")
iddescriptionname
0bcBlack CarbonBC
1coCarbon MonoxideCO
2no2Nitrogen DioxideNO2
3o3OzoneO3
4pm10Particulate matter less than 10 micrometers in...PM10
5pm25Particulate matter less than 2.5 micrometers i...PM2.5
6so2Sulfur DioxideSO2
0)
date.utccitylocationparametervalueiddescriptionname
02019-04-09 01:00:00+00:00ParisFR04014no224.4no2Nitrogen DioxideNO2
12019-04-09 01:00:00+00:00AntwerpenBETR801pm2576.0pm25Particulate matter less than 2.5 micrometers i...PM2.5
22019-04-09 01:00:00+00:00AntwerpenBETR801no222.5no2Nitrogen DioxideNO2
32019-04-09 02:00:00+00:00LondonLondon Westminsterno267.0no2Nitrogen DioxideNO2
42019-04-09 02:00:00+00:00ParisFR04014no227.4no2Nitrogen DioxideNO2

与前面的例子相比,没有共同的列名。但是,air_quality表中的parameter列和air_quality_parameters中的id列变量格式相同。这里使用left_on和right_on参数(而不使用on)在两个表之间建立联系。

---------------分割线-------------------

除了上面提到的两种组合方法,还有一种可以把两个不同index的DataFrame组合成一个的方法join(),join方法的功能比较简单:把两个数据index组合起来;或者将一个数据的index连接到另一个数据的某列上。

'A': [
AB
K0A0B0
K1A1B1
K2A2B2
'C': [
CD
K0C0D0
K2C2D2
K3C3D3
# 默认左数据的index
ABCD
K0A0B0C0D0
K1A1B1NaNNaN
K2A2B2C2D2
'outer') 
ABCD
K0A0B0C0D0
K1A1B1NaNNaN
K2A2B2C2D2
K3NaNNaNC3D3
'inner') 
ABCD
K0A0B0C0D0
K2A2B2C2D2
'A': [
ABkey
0A0B0K0
1A1B1K1
2A2B2K0
3A3B3K1
'C': [
CD
K0C0D0
K1C1D1
'key') 
ABkeyCD
0A0B0K0C0D0
1A1B1K1C1D1
2A2B2K0C0D0
3A3B3K1C1D1

join方法一般用merge都可以实现,但merge的用法相关复杂,灵活运用join可以简化表达。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值