pandas的操作使用

pandas读取csv文件

在pandas读里面包含了几个函数分别用来读取csv或者excel文件:
read_csv方法用来读取一个csv文件一般常用参数是path:用于指定一个文件及其目录
sep表示读取该csv文件的时候是以什么制表符读取的,一般是’,’
usecols表示需要读取csv的多少列,这是一个绝对索引,0代表的是第一列,参数为一个list

Pandas的结构:

pandas经常使用的结构一般是dataframe和series,DataFrame类似于二维数组,或者sql里面的一张表,若在创建的时候为指定索引的话则默认从0开始一次递增为索引:

1
2
3
4
5
6
7
8
9
10
11
12
import pandas as pd
In [15]: df_2=pd.DataFrame(data=['a','b','c'])

In [16]: df_2
Out[16]:
0
0 a
1 b
2 c
用上述方式创建的时候是不需要指定index的,但是用标量创建的时候是需要指定index的:
pd.DataFrame({'a':'A','b':'B'})
ValueError: If using all scalar values, you must pass an index

基本实例:

读取北京2017年07月01日的空气质量情况:

1
2
3
4
5
6
7
8
9
10
11
12
13
 df_20170101 =pd.read_csv(path,sep=',',decimal=',',usecols=[0,1,2,3,4,5,6,7,8,9]) #path是我的文件地址
date hour type dongfour 天坛 官园 万寿西宫 奥体中心 农展馆 万柳
0 20170101 22 PM2.5 469 357 476 416 453 398 468
1 20170101 22 PM2.5_24h NaN NaN NaN NaN NaN NaN NaN
2 20170101 22 PM10 594 449 548 474 467 469 518
3 20170101 22 PM10_24h NaN NaN NaN NaN NaN NaN NaN
4 20170101 22 AQI 494 405 484 444 469 432 479
5 20170101 23 PM2.5 470 351 500 403 417 392 459
6 20170101 23 PM2.5_24h NaN NaN NaN NaN NaN NaN NaN
7 20170101 23 PM10 558 467 583 469 443 480 529
8 20170101 23 PM10_24h NaN NaN NaN NaN NaN NaN NaN
9 20170101 23 AQI 480 401 500 435 445 428 473

假设需要获取天坛的22点到23点情况,那么只需要使用df_20170101[‘天坛’]:

1
2
3
4
5
6
7
8
9
10
0    357
1 NaN
2 449
3 NaN
4 405
5 351
6 NaN
7 467
8 NaN
9 401

这就是pandas的另一种结构:series,类似于一个竖着地数组,那么假设现在需要获取天坛的22点的pm2.5

1
2
3
4
5
6
7
8
一种方式是知道索引:
In [6]: df_20170101.loc[0]['天坛']
Out[6]: 357.0
一种则是获取22点并且type为PM2.5的时候的天坛
In [7]: df_20170101.loc[(df_20170101['hour']==22) & (df_20170101['type']=='PM2.5'),'天坛']
Out[7]:
0 357
Name: 天坛, dtype: float64

那么这个数据中有很多的NaN值,其中PM2.5_24h的值发现都为NaN,则这个值其实是可以被剔除的,那么常用的做法就是:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
In [8]: df_20170101.loc[~df_20170101['dongfour'].isnull()]
Out[8]:
date hour type dongfour 天坛 官园 万寿西宫 奥体中心 农展馆 万柳
0 20170101 22 PM2.5 469 357 476 416 453 398 468
2 20170101 22 PM10 594 449 548 474 467 469 518
4 20170101 22 AQI 494 405 484 444 469 432 479
5 20170101 23 PM2.5 470 351 500 403 417 392 459
7 20170101 23 PM10 558 467 583 469 443 480 529
9 20170101 23 AQI 480 401 500 435 445 428 473

至于为什么选择dongfour是因为选择其他的也是一样的,都可以,但是如果需要将NaN的值替换成0的话只需要执行
In [9]: df_20170101.fillna(0)
Out[9]:
date hour type dongfour 天坛 官园 万寿西宫 奥体中心 农展馆 万柳
0 20170101 22 PM2.5 469 357 476 416 453 398 468
1 20170101 22 PM2.5_24h 0 0 0 0 0 0 0
2 20170101 22 PM10 594 449 548 474 467 469 518
3 20170101 22 PM10_24h 0 0 0 0 0 0 0
4 20170101 22 AQI 494 405 484 444 469 432 479
5 20170101 23 PM2.5 470 351 500 403 417 392 459
6 20170101 23 PM2.5_24h 0 0 0 0 0 0 0
7 20170101 23 PM10 558 467 583 469 443 480 529
8 20170101 23 PM10_24h 0 0 0 0 0 0 0
9 20170101 23 AQI 480 401 500 435 445 428 473
就会将NaN值全部转为0

Group实例:

若现在需要统计dongfour的22到23点的PM2.5平均值,那么需要对type进行groupby:

1
2
3
4
5
6
7
8
9
10
11
12
In [29]: df_20170101['dongfourmean']=df_20170101.groupby('type')['dongfour'].apply(lambda x : pd.Series(np.mean(x),index=x.index))

In [30]: df_20170101
Out[30]:
date hour type dongfour 天坛 官园 奥体中心 农展馆 万柳 dongfourmean
0 20170101 22 PM2.5 469 357 476 453 398 468 469.5
2 20170101 22 PM10 594 449 548 467 469 518 576.0
4 20170101 22 AQI 494 405 484 469 432 479 487.0
5 20170101 23 PM2.5 470 351 500 417 392 459 469.5
7 20170101 23 PM10 558 467 583 443 480 529 576.0
9 20170101 23 AQI 480 401 500 445 428 473 487.0
因为df_20170101['dongfourmean']是一个Series所以返回的时候也是需要Series

若现在需要求的是dongfour到万柳的22点的PM2.5平均值则是可以先对df_20170101进行一个转置操作:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
In [35]: df_T
Out[35]:
0 2 4 5 7 9
date 20170101 20170101 20170101 20170101 20170101 20170101
hour 22 22 22 23 23 23
type PM2.5 PM10 AQI PM2.5 PM10 AQI
dongfour 469 594 494 470 558 480
天坛 357 449 405 351 467 401
官园 476 548 484 500 583 500
奥体中心 453 467 469 417 443 445
农展馆 398 469 432 392 480 428
万柳 468 518 479 459 529 473
dongfourmean 469.5 576 487 469.5 576 487

In [38]: np.mean(df_T.ix[3:8][0])
Out[38]: 430.60000000000002

注意细节:

pandas进行group之后是不可以在用loc进行操作的,即在pandas里面GroupBy objects进行一些操作的话可以采用apply,而不能使用loc
若非要使用loc则在使用groups之后转化成一个dataframe之后再进行一些dataframe的操作

作者

Somersames

发布于

2017-12-03

更新于

2021-12-05

许可协议

评论