2021.11.13
【小旭学长-使用python进行城市数据分析】说明篇(开篇 )https://blog.csdn.net/wistonty11/article/details/121347825
【小旭学长-使用python进行城市数据分析】笔记篇(上):https://blog.csdn.net/wistonty11/article/details/121089882
【小旭学长-使用python进行城市数据分析】笔记篇(中):https://blog.csdn.net/wistonty11/article/details/121210664
【小旭学长-使用python进行城市数据分析】笔记篇(下):https://blog.csdn.net/wistonty11/article/details/121308188
文章目录
五. IC刷卡数据的基本处理
5.1基于IC刷卡数据的地铁OD提取
① 读取数据,添加列名
import pandas as pd
data = pd.read_csv("SPTCC-20150401-sample.csv",header = None)
data
0 | 1 | 2 | 3 | 4 | 5 | 6 | |
---|---|---|---|---|---|---|---|
0 | 100405844 | 2015-04-01 | 12:43:24 | 11号线祁连山路 | 地铁 | 4.0 | 非优惠 |
1 | 100405844 | 2015-04-01 | 18:22:04 | 11号线枫桥路 | 地铁 | 3.0 | 非优惠 |
2 | 100405844 | 2015-04-01 | 08:21:18 | 2号线娄山关路 | 地铁 | 3.0 | 非优惠 |
3 | 100405844 | 2015-04-01 | 12:07:31 | 2号线娄山关路 | 地铁 | 0.0 | 非优惠 |
4 | 100405844 | 2015-04-01 | 18:08:42 | 11号线祁连山路 | 地铁 | 0.0 | 非优惠 |
... | ... | ... | ... | ... | ... | ... | ... |
442855 | 2301108266 | 2015-04-01 | 23:48:21 | 2号线中山公园 | 地铁 | 4.0 | 非优惠 |
442856 | 2301108266 | 2015-04-01 | 23:06:45 | 2号线虹桥火车站 | 地铁 | 0.0 | 非优惠 |
442857 | 2104162123 | 2015-04-01 | 23:48:07 | 2号线中山公园 | 地铁 | 4.0 | 非优惠 |
442858 | 2104162123 | 2015-04-01 | 23:18:16 | 2号线虹桥火车站 | 地铁 | 0.0 | 非优惠 |
442859 | 3103885141 | 2015-04-01 | 23:16:19 | 2号线虹桥火车站 | 地铁 | 0.0 | 非优惠 |
442860 rows × 7 columns
data.columns = ['ID', 'date', 'Time', 'stop', 'mode', 'price', 'type']
data
ID | date | Time | stop | mode | price | type | |
---|---|---|---|---|---|---|---|
0 | 100405844 | 2015-04-01 | 12:43:24 | 11号线祁连山路 | 地铁 | 4.0 | 非优惠 |
1 | 100405844 | 2015-04-01 | 18:22:04 | 11号线枫桥路 | 地铁 | 3.0 | 非优惠 |
2 | 100405844 | 2015-04-01 | 08:21:18 | 2号线娄山关路 | 地铁 | 3.0 | 非优惠 |
3 | 100405844 | 2015-04-01 | 12:07:31 | 2号线娄山关路 | 地铁 | 0.0 | 非优惠 |
4 | 100405844 | 2015-04-01 | 18:08:42 | 11号线祁连山路 | 地铁 | 0.0 | 非优惠 |
... | ... | ... | ... | ... | ... | ... | ... |
442855 | 2301108266 | 2015-04-01 | 23:48:21 | 2号线中山公园 | 地铁 | 4.0 | 非优惠 |
442856 | 2301108266 | 2015-04-01 | 23:06:45 | 2号线虹桥火车站 | 地铁 | 0.0 | 非优惠 |
442857 | 2104162123 | 2015-04-01 | 23:48:07 | 2号线中山公园 | 地铁 | 4.0 | 非优惠 |
442858 | 2104162123 | 2015-04-01 | 23:18:16 | 2号线虹桥火车站 | 地铁 | 0.0 | 非优惠 |
442859 | 3103885141 | 2015-04-01 | 23:16:19 | 2号线虹桥火车站 | 地铁 | 0.0 | 非优惠 |
442860 rows × 7 columns
② 帅选出地铁方式的出行,并将站点信息拆成,线路和站名
data = data[data['mode'] == '地铁']
data
ID | date | Time | stop | mode | price | type | |
---|---|---|---|---|---|---|---|
0 | 100405844 | 2015-04-01 | 12:43:24 | 11号线祁连山路 | 地铁 | 4.0 | 非优惠 |
1 | 100405844 | 2015-04-01 | 18:22:04 | 11号线枫桥路 | 地铁 | 3.0 | 非优惠 |
2 | 100405844 | 2015-04-01 | 08:21:18 | 2号线娄山关路 | 地铁 | 3.0 | 非优惠 |
3 | 100405844 | 2015-04-01 | 12:07:31 | 2号线娄山关路 | 地铁 | 0.0 | 非优惠 |
4 | 100405844 | 2015-04-01 | 18:08:42 | 11号线祁连山路 | 地铁 | 0.0 | 非优惠 |
... | ... | ... | ... | ... | ... | ... | ... |
442855 | 2301108266 | 2015-04-01 | 23:48:21 | 2号线中山公园 | 地铁 | 4.0 | 非优惠 |
442856 | 2301108266 | 2015-04-01 | 23:06:45 | 2号线虹桥火车站 | 地铁 | 0.0 | 非优惠 |
442857 | 2104162123 | 2015-04-01 | 23:48:07 | 2号线中山公园 | 地铁 | 4.0 | 非优惠 |
442858 | 2104162123 | 2015-04-01 | 23:18:16 | 2号线虹桥火车站 | 地铁 | 0.0 | 非优惠 |
442859 | 3103885141 | 2015-04-01 | 23:16:19 | 2号线虹桥火车站 | 地铁 | 0.0 | 非优惠 |
360873 rows × 7 columns
r = data['stop'].iloc[0]
r
'11号线祁连山路'
r.find('线')
3
r[:r.find('线')+1]
'11号线'
r[r.find('线')+1:]
'祁连山路'
data['line'] = data['stop'].apply(lambda r:r[:r.find('线')+1])
data
C:\ProgramData\Anaconda3\envs\tensorflow\lib\site-packages\ipykernel_launcher.py: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
"""Entry point for launching an IPython kernel.
ID | date | Time | stop | mode | price | type | line | |
---|---|---|---|---|---|---|---|---|
0 | 100405844 | 2015-04-01 | 12:43:24 | 11号线祁连山路 | 地铁 | 4.0 | 非优惠 | 11号线 |
1 | 100405844 | 2015-04-01 | 18:22:04 | 11号线枫桥路 | 地铁 | 3.0 | 非优惠 | 11号线 |
2 | 100405844 | 2015-04-01 | 08:21:18 | 2号线娄山关路 | 地铁 | 3.0 | 非优惠 | 2号线 |
3 | 100405844 | 2015-04-01 | 12:07:31 | 2号线娄山关路 | 地铁 | 0.0 | 非优惠 | 2号线 |
4 | 100405844 | 2015-04-01 | 18:08:42 | 11号线祁连山路 | 地铁 | 0.0 | 非优惠 | 11号线 |
... | ... | ... | ... | ... | ... | ... | ... | ... |
442855 | 2301108266 | 2015-04-01 | 23:48:21 | 2号线中山公园 | 地铁 | 4.0 | 非优惠 | 2号线 |
442856 | 2301108266 | 2015-04-01 | 23:06:45 | 2号线虹桥火车站 | 地铁 | 0.0 | 非优惠 | 2号线 |
442857 | 2104162123 | 2015-04-01 | 23:48:07 | 2号线中山公园 | 地铁 | 4.0 | 非优惠 | 2号线 |
442858 | 2104162123 | 2015-04-01 | 23:18:16 | 2号线虹桥火车站 | 地铁 | 0.0 | 非优惠 | 2号线 |
442859 | 3103885141 | 2015-04-01 | 23:16:19 | 2号线虹桥火车站 | 地铁 | 0.0 | 非优惠 | 2号线 |
360873 rows × 8 columns
data['stop'] = data['stop'].apply(lambda r:r[r.find('线')+1:])
data
C:\ProgramData\Anaconda3\envs\tensorflow\lib\site-packages\ipykernel_launcher.py: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
"""Entry point for launching an IPython kernel.
ID | date | Time | stop | mode | price | type | line | |
---|---|---|---|---|---|---|---|---|
0 | 100405844 | 2015-04-01 | 12:43:24 | 祁连山路 | 地铁 | 4.0 | 非优惠 | 11号线 |
1 | 100405844 | 2015-04-01 | 18:22:04 | 枫桥路 | 地铁 | 3.0 | 非优惠 | 11号线 |
2 | 100405844 | 2015-04-01 | 08:21:18 | 娄山关路 | 地铁 | 3.0 | 非优惠 | 2号线 |
3 | 100405844 | 2015-04-01 | 12:07:31 | 娄山关路 | 地铁 | 0.0 | 非优惠 | 2号线 |
4 | 100405844 | 2015-04-01 | 18:08:42 | 祁连山路 | 地铁 | 0.0 | 非优惠 | 11号线 |
... | ... | ... | ... | ... | ... | ... | ... | ... |
442855 | 2301108266 | 2015-04-01 | 23:48:21 | 中山公园 | 地铁 | 4.0 | 非优惠 | 2号线 |
442856 | 2301108266 | 2015-04-01 | 23:06:45 | 虹桥火车站 | 地铁 | 0.0 | 非优惠 | 2号线 |
442857 | 2104162123 | 2015-04-01 | 23:48:07 | 中山公园 | 地铁 | 4.0 | 非优惠 | 2号线 |
442858 | 2104162123 | 2015-04-01 | 23:18:16 | 虹桥火车站 | 地铁 | 0.0 | 非优惠 | 2号线 |
442859 | 3103885141 | 2015-04-01 | 23:16:19 | 虹桥火车站 | 地铁 | 0.0 | 非优惠 | 2号线 |
360873 rows × 8 columns
③ 我们想用点对,所以用ID进行排序 然后用.shift
让数据表错一行,让两表连接,去掉不是一个人的
- 用
.sort_values()
进行排序
data = data.sort_values(by = ['ID', 'date', 'Time'])
- 创建一个从第二列开始的表
data['ID1'] = data["ID"].shift(-1)
data
ID | date | Time | stop | mode | price | type | line | ID1 | |
---|---|---|---|---|---|---|---|---|---|
334427 | 82024 | 2015-04-01 | 08:48:25 | 西藏北路 | 地铁 | 0.0 | 非优惠 | 8号线 | 8.202400e+04 |
334426 | 82024 | 2015-04-01 | 09:07:29 | 江湾体育场 | 地铁 | 4.0 | 非优惠 | 10号线 | 8.895700e+04 |
381022 | 88957 | 2015-04-01 | 15:46:58 | 宜山路 | 地铁 | 0.0 | 非优惠 | 3号线 | 8.895700e+04 |
381021 | 88957 | 2015-04-01 | 16:20:58 | 东宝兴路 | 地铁 | 4.0 | 非优惠 | 3号线 | 9.931300e+04 |
376286 | 99313 | 2015-04-01 | 08:26:26 | 延吉中路 | 地铁 | 0.0 | 非优惠 | 8号线 | 9.931300e+04 |
... | ... | ... | ... | ... | ... | ... | ... | ... | ... |
218391 | 4000039067 | 2015-04-01 | 07:32:48 | 颛桥 | 地铁 | 1.0 | 优惠 | 5号线 | 4.000040e+09 |
373585 | 4000039743 | 2015-04-01 | 18:11:15 | 南京西路 | 地铁 | 0.0 | 非优惠 | 2号线 | 4.000040e+09 |
373584 | 4000039743 | 2015-04-01 | 18:28:44 | 交通大学 | 地铁 | 3.0 | 非优惠 | 10号线 | 4.000041e+09 |
171701 | 4000040665 | 2015-04-01 | 08:48:34 | 上海体育场 | 地铁 | 0.0 | 非优惠 | 4号线 | 4.000041e+09 |
171702 | 4000040665 | 2015-04-01 | 09:16:55 | 南京东路 | 地铁 | 4.0 | 非优惠 | 10号线 | NaN |
360873 rows × 9 columns
# 确实有上移 那么我们把测试的这列去掉
data = data.drop('ID1' ,axis = 1)
data
ID | date | Time | stop | mode | price | type | line | |
---|---|---|---|---|---|---|---|---|
334427 | 82024 | 2015-04-01 | 08:48:25 | 西藏北路 | 地铁 | 0.0 | 非优惠 | 8号线 |
334426 | 82024 | 2015-04-01 | 09:07:29 | 江湾体育场 | 地铁 | 4.0 | 非优惠 | 10号线 |
381022 | 88957 | 2015-04-01 | 15:46:58 | 宜山路 | 地铁 | 0.0 | 非优惠 | 3号线 |
381021 | 88957 | 2015-04-01 | 16:20:58 | 东宝兴路 | 地铁 | 4.0 | 非优惠 | 3号线 |
376286 | 99313 | 2015-04-01 | 08:26:26 | 延吉中路 | 地铁 | 0.0 | 非优惠 | 8号线 |
... | ... | ... | ... | ... | ... | ... | . |