使用pandas进行数据分析

整理一下最近使用pandas处理数据的操作,整理一下用到的几个操作。

  1. 从csv文件里面读取数据
import pandas as pd 
import numpy as np 
import matplotlib.pyplot as plt 

df = pd.read_csv("test_csv.csv")
print (df)

《使用pandas进行数据分析》

  1. 显示某一个的数据,并画个图
df = pd.read_csv("test_csv.csv")
df['speed'].plot()
plt.show()

《使用pandas进行数据分析》

  1. 访问某一个元素的值
# 访问某一列的某一个元素
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])   #同样支持下标操作
  1. 处理时间序列
    我的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'>
  1. 条件选择
    选择速度大于4的数据
print (df[df['vol'] >4])

# 输出
            road  vol  speed      last-update-time
2  公园中路(人民路-河南路)  5.0   70.0  2012-11-15  5:57:57 
  1. 设置索引
    原来的数据的索引是序号,这样处理起来很不方便。我需要将’last-update-time’设置成索引列。
data.set_index(['last-update-time'],inplace=True)  #inplace 表示在原来的数据df上面修改
  1. 去重某一列的重复数据 , 下表里面的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)
  1. 保存为csv文件
df.to_csv('new.csv')
  1. 填充为nan的数据
df=df.fillna(method='bfill')  #method = ffill
  1. 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])  #删掉秒
  1. 构造一个dataframe
    df =pd.DataFrame(
        {
            'road':'gongyuanzhonglu(renminglu-henanlu)',
            'vol':np.array(vol_col),
            'speed':np.array(speed_col),
            'last-update-time':time_col,
        }
    )
  1. 时间处理

    《使用pandas进行数据分析》

这是我遇到的一个问题,在操作中,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

《使用pandas进行数据分析》 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之内的数据。

《使用pandas进行数据分析》

还可以以如下的方式,查询

《使用pandas进行数据分析》

  1. 查询数据
    查询流量大于13 速度大于42的数据
    df[(df[‘vol’]>13 )& (df[‘speed’]>42)] # 注意 & 前后的两个条件需要加上括号

《使用pandas进行数据分析》 image.png

14.设置索引

df.index=df['列名']   # 这样就可以以 df['索引'] 来访问数据了
  1. 元素过滤
    想将大于speed大于45的元素,全都设置成45。用apply函数很方便。
df['speed']=df['speed'].apply(lambda x : min(x,110))
  1. 向一个df里面追加一行
newdf = pd.DataFrame(columns=['road','vol','speed','last-update-time'])
newdf.loc[newdf.shape[0]]=[name,vol_item,speed_item,select_str]
    原文作者:爱秋刀鱼的猫
    原文地址: https://www.jianshu.com/p/b7008683bc2d
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞