今天來將資料載入Python中,並進行一些簡單的運算。
發現資料共有426887筆數據,因此花了一點時間來跑。
首先使用import匯入所需套件,並載入csv檔案。
import csv
import pandas as pd
import numpy as np
import datetime as dt
with open("data of 12 months 2020.csv","r") as csvfile:
rows=csv.reader(csvfile)
L=[]
for row in rows:
L.append(row)
data=pd.DataFrame(L[1:426888],columns=L[0])
接著檢查資料是否有空值
data.info()
data.info()
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 426887 entries, 0 to 426886
Data columns (total 15 columns):
# Column Non-Null Count Dtype
--- ------ -------------- -----
0 ride_id 426887 non-null object
1 rideable_type 426887 non-null object
2 started_at 426887 non-null object
3 ended_at 426887 non-null object
4 start_station_name 426887 non-null object
5 start_station_id 426887 non-null object
6 end_station_name 426887 non-null object
7 end_station_id 426887 non-null object
8 start_lat 426887 non-null object
9 start_lng 426887 non-null object
10 end_lat 426887 non-null object
11 end_lng 426887 non-null object
12 member_casual 426887 non-null object
13 ride_length 426887 non-null object
14 day_of_the_week 426887 non-null object
dtypes: object(15)
memory usage: 48.9+ MB
因為已知有兩個欄位是日期,故修改資料屬性(dtype)為日期。
data['started_at']=pd.to_datetime(data['started_at'])
data['ended_at']=pd.to_datetime(data['ended_at'])
此時在查詢dataframe,即可發現屬性已更改。
data.info()
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 426887 entries, 0 to 426886
Data columns (total 15 columns):
# Column Non-Null Count Dtype
--- ------ -------------- -----
0 ride_id 426887 non-null object
1 rideable_type 426887 non-null object
2 started_at 426887 non-null datetime64[ns]
3 ended_at 426887 non-null datetime64[ns]
4 start_station_name 426887 non-null object
5 start_station_id 426887 non-null object
6 end_station_name 426887 non-null object
7 end_station_id 426887 non-null object
8 start_lat 426887 non-null object
9 start_lng 426887 non-null object
10 end_lat 426887 non-null object
11 end_lng 426887 non-null object
12 member_casual 426887 non-null object
13 ride_length 426887 non-null object
14 day_of_the_week 426887 non-null object
dtypes: datetime64[ns](2), object(13)
memory usage: 48.9+ MB
進行基礎計算
data['ride_id'].nunique() #不重複使用者數量
sum(data['member_casual']=='member')#會員數量
sum(data['member_casual']=='casual')#非會員數量
###
data['ride_id'].nunique()
Out[5]: 426870
sum(data['member_casual']=='member')
Out[7]: 378407
sum(data['member_casual']=='casual')
Out[8]: 48480
因為【租借時間長短】與【會員】是這份數據中蠻重要的資訊,因此我先將data用'ride_length'這欄來降冪排序觀察
data1=data.sort_values('ride_length',ascending=False)
print(data1.head(5))
print(data1.tail(10))
ride_id rideable_type ... ride_length day_of_the_week
1354 2D4EA0D9064662D6 docked_bike ... 23:56:49 3
353057 651C959936BA3227 docked_bike ... 23:56:45 4
226720 EB83072244DF5183 docked_bike ... 23:55:55 4
107043 8994CCC830A3DDF1 docked_bike ... 23:54:37 5
341354 B6DE81A51970FF21 docked_bike ... 23:54:27 7
[5 rows x 15 columns]
ride_id ... day_of_the_week
36003 A2DB7BCC7AB7F146 ... 2
49001 323CAC41316F59B2 ... 6
28252 20F8FA5027ACB687 ... 4
35697 A942AA191C6BE467 ... 2
28009 4B1478D45C94AB00 ... 4
24409 8151A1ECCD4115C9 ... 6
26425 3CC0D87545CE223B ... 5
48966 F11811E0E538496C ... 6
35889 35FA27C6C7E9CF72 ... 2
26078 0471ABC706B0F5D9 ... 5
[10 rows x 15 columns]
此時發現沒有出現後十筆的時間,選了幾個index想一探究竟
卻發現印出來的是無數個#
原以為資料沒有空值蠻乾淨的,結果還是有一些需要清理的資料xd
回去原始檔案看,也發現真的有不少租借時間為「#」的欄位。
也有大概看一下這幾個是「#」的資料,在租借與租還的地點都是HQ,猜測大概是在車輛維護時的資料吧。
原本想要在今天將含有#的資料從DataFrame中刪除的,但是試了幾種方法都沒有成功。
眼看交稿時間要到了,就先來更新文章xd
明天再來更新進度!
順便附上測試時回報錯誤的資訊:
#test1
data_clear=data.drop(data[data['ride_length']=='#*'].index)
#test2
L1=[]
for i in data1:
if data1.iloc[i,13]!='#%':
L1.append(data1[:,:])
else:
pass
第一筆雖然沒有錯誤,但是筆數卻沒有減少
第二筆出現了以下訊息
ValueError: Location based indexing can only have [integer, integer slice (START point is INCLUDED, END point is EXCLUDED), listlike of integers, boolean array] types
明天見!