使用pandas进行数据分析
2018-01-31 本文已影响0人
爱秋刀鱼的猫
整理一下最近使用pandas处理数据的操作,整理一下用到的几个操作。
- 从csv文件里面读取数据
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
df = pd.read_csv("test_csv.csv")
print (df)
- 显示某一个的数据,并画个图
df = pd.read_csv("test_csv.csv")
df['speed'].plot()
plt.show()
- 访问某一个元素的值
# 访问某一列的某一个元素
df['speed'][0]
# 使用loc函数 or iloc函数
print (df.loc[1,'speed']) #df.loc[index名,列名] 这里的index正好是数字,所以这里正好可以这么写,不要理解错了
print (df.loc[:,['speed','vol']]) # 支持切片操作
print (df.iloc[1,2]) #df.iloc[index的序号,列的序号] #注意,必须是序号
print (df.iloc[1:3,0:2]) #同样支持下标操作
- 处理时间序列
我的csv文件里面有一列是时间格式的数据,但是在read之后在dataframe里面是以string 的方式保存的,所以要处理一下,转换成时间的格式。
"""
road vol speed last-update-time
0 公园中路(人民路-河南路) 3.0 92.0 2012-11-15 5:59:57
1 公园中路(人民路-河南路) 4.0 39.0 2012-11-15 5:58:57
2 公园中路(人民路-河南路) 5.0 70.0 2012-11-15 5:57:57
3 公园中路(人民路-河南路) NaN NaN 2012-11-15 5:56:57
4 公园中路(人民路-河南路) NaN NaN 2012-11-15 5:55:57
5 公园中路(人民路-河南路) NaN NaN 2012-11-15 5:54:57
"""
print (df.iloc[1,3])
print (type(df.iloc[1,3]))
#输出
#2012-11-15 5:58:57
#<class 'str'>
df['last-update-time'] = pd.to_datetime(df['last-update-time'])
print (df.iloc[1,3])
print (type(df.iloc[1,3]))
#输出
#2012-11-15 05:58:57
#<class 'pandas._libs.tslib.Timestamp'>
- 条件选择
选择速度大于4的数据
print (df[df['vol'] >4])
# 输出
road vol speed last-update-time
2 公园中路(人民路-河南路) 5.0 70.0 2012-11-15 5:57:57
- 设置索引
原来的数据的索引是序号,这样处理起来很不方便。我需要将'last-update-time'设置成索引列。
data.set_index(['last-update-time'],inplace=True) #inplace 表示在原来的数据df上面修改
- 去重某一列的重复数据 , 下表里面的last-update-time的列里面,倒数两列的数据是相同的,如果需要去掉的话,要怎么办?
"""
road vol speed last-update-time
0 公园中路(人民路-河南路) 3.0 92.0 2012-11-15 5:59:57
1 公园中路(人民路-河南路) 4.0 39.0 2012-11-15 5:57:57
2 公园中路(人民路-河南路) 5.0 70.0 2012-11-15 5:57:57
"""
# 去除‘last-update-time’的重复数据
# 'first' 参数表示如果找到重复的数据,那个保留第一个
data.drop_duplicates('last-update-time','first',inplace=True)
- 保存为csv文件
df.to_csv('new.csv')
- 填充为nan的数据
df=df.fillna(method='bfill') #method = ffill
- map函数
如果我想把‘last-update-time’列的数据中的秒删掉,从2012-11-15 5:59:57 变成 2012-11-15 5:59 这样的格式。
data['last-update-time'] = data['last-update-time'].map(lambda s:s[:-4]) #删掉秒
- 构造一个dataframe
df =pd.DataFrame(
{
'road':'gongyuanzhonglu(renminglu-henanlu)',
'vol':np.array(vol_col),
'speed':np.array(speed_col),
'last-update-time':time_col,
}
)
-
时间处理
这是我遇到的一个问题,在操作中,last-update-time 是一个时间列,但是里面的时间的秒的单位是随机的。所以查找的时候,(由于不知道秒的单位)所以没有办法进行查找。
解决的办法:
- 方法1:
利用df['last-update-time'].dt.date 获得日期,df['last-update-time'].dt.hour 获得小时 , df['last-update-time'].dt.minute 获得时间。然后创建两个新的列,一个是date,一个是time。date用来保存时间,time用来保存
In [10]: df['last-update-time'].dt.date
Out[10]:
last-update-time
2012-11-22 10:12:36 2012-11-22
2012-11-22 10:11:35 2012-11-22
2012-11-22 10:10:36 2012-11-22
2012-11-22 10:09:35 2012-11-22
2012-11-22 10:08:35 2012-11-22
Name: last-update-time, dtype: object
In [11]: df['last-update-time'].dt.hour
Out[11]:
last-update-time
2012-11-22 10:12:36 10
2012-11-22 10:11:35 10
2012-11-22 10:10:36 10
2012-11-22 10:09:35 10
2012-11-22 10:08:35 10
Name: last-update-time, dtype: int64
In [12]: df['last-update-time'].dt.minute
Out[12]:
last-update-time
2012-11-22 10:12:36 12
2012-11-22 10:11:35 11
2012-11-22 10:10:36 10
2012-11-22 10:09:35 9
2012-11-22 10:08:35 8
Name: last-update-time, dtype: int64
创建一个新的列date
In [14]: df
Out[14]:
road vol speed last-update-time date
last-update-time
2012-11-22 10:12:36 人民中路(港东路-和平路) 18 41 2012-11-22 10:12:36 2012-11-22
2012-11-22 10:11:35 人民中路(港东路-和平路) 15 48 2012-11-22 10:11:35 2012-11-22
2012-11-22 10:10:36 人民中路(港东路-和平路) 10 40 2012-11-22 10:10:36 2012-11-22
2012-11-22 10:09:35 人民中路(港东路-和平路) 18 43 2012-11-22 10:09:35 2012-11-22
2012-11-22 10:08:35 人民中路(港东路-和平路) 12 40 2012-11-22 10:08:35 2012-11-22
创建一个time列 表示分钟数
df['time'] = df['last-update-time'].dt.hour * 60 + df['last-update-time'].dt.minute
image.png
这样可以通过date + time 列的方式来访问。这样虽然是可以实现,但是太麻烦了。
- 方法2
将last-update-time 设置成索引 df.index=df['last-update-time']
In [23]: df.index=df['last-update-time']
In [24]: df
Out[24]:
road vol speed last-update-time
last-update-time
2012-11-22 10:12:36 人民中路(港东路-和平路) 18 41 2012-11-22 10:12:36
2012-11-22 10:11:35 人民中路(港东路-和平路) 15 48 2012-11-22 10:11:35
2012-11-22 10:10:36 人民中路(港东路-和平路) 10 40 2012-11-22 10:10:36
2012-11-22 10:09:35 人民中路(港东路-和平路) 18 43 2012-11-22 10:09:35
2012-11-22 10:08:35 人民中路(港东路-和平路) 12 40 2012-11-22 10:08:35
将时间设置成索引之后,查询的时候就非常方便了,可以支持“模糊”的查询。
比如,我要找2012-11-22 10:12点的数据,它就会返回在10:12~10:13之内的数据。
还可以以如下的方式,查询
- 查询数据
查询流量大于13 速度大于42的数据
df[(df['vol']>13 )& (df['speed']>42)] # 注意 & 前后的两个条件需要加上括号
14.设置索引
df.index=df['列名'] # 这样就可以以 df['索引'] 来访问数据了
- 元素过滤
想将大于speed大于45的元素,全都设置成45。用apply函数很方便。
df['speed']=df['speed'].apply(lambda x : min(x,110))
- 向一个df里面追加一行
newdf = pd.DataFrame(columns=['road','vol','speed','last-update-time'])
newdf.loc[newdf.shape[0]]=[name,vol_item,speed_item,select_str]