本文写于大二,由于原博客网站到期,文章尘封已久。现重新排版,对文章进行勘误和加入新的内容。
pandas是一个python的数据处理库,一般搭配numpy使用。在pandas当中数据被抽象成excel表格,使用一种 Dataframe的数据类型。类似一个excel表格,有列名,有索引。经常我们会访问某一列的数据,直接使用列名就可以访问 Dataframe['longitude'], 不过返回的是Series类的数据 ,为了方便操作,可以使用data.values直接转换成 数组类型.(很方便配合matpylotlib绘图!!!)大部分的函数操作都是围绕表格的行或列进行操作,以下是总结的一些常用函数操作。不必记住,需要的时候查询即可。
通常数据储存在csv或者excel中,调用数据集如下:
pythonimport pandas as pd # 导入模块
data = pd.read_csv() # 读取csv
data2 = pd.read_excel() # 读取xls 或者 xlsx
pythonprint(data.shape) # 查看数据的维度
print(data.info()) # 查看数据的基本信息
print(data.head()) # 查看数据的前五行
print(data.tail(10)) #查看末尾的10行
print(data.isnull()) # 查看所有数据是否有空值,有则为True
print(data.columns) # 查看数据的所有列名称(不常用)
print(data['longitude'].unique()) # 查看某‘longitude’列唯一数据
pythonpd.fillna(value=0) # 将空值用0填充
data['prince'].fillna(df['prince'].mean()) # 用该列的平均数填充该列的空值,或者用其它值填充
data['city'].replace('sh', 'shanghai') # 某列数据替换,将sh替换成shanghai
python
#筛选符合条件的数据 !!!很常用
DataFrame2['latitude'].max() #取某列的最值
DataFrame2 = DataFrame[(DataFrame['timestamp'] > "2019-01-03 UTC") & (DataFrame['timestamp']<"2019-01-04 UTC")]
#根据时间去筛选的,每个约束条件需要用括号,约束条件的关系 可以使用 "&" 或者 "|" 表示
tmp = tmp.drop_duplicates('carsList') #筛选某列重复的数据 ! 可以多个列名
res = DataFrame.drop_duplicates(['latitude', 'longitude']) #多个列名 经纬度都相同的重复数据会被清洗(and 的重复逻辑,都要重复才会被删除)
tmp['carsList'].count() #计算某列的非空数据量
res = DataFrame.duplicated(['latitude', 'longitude', 'carsList']) #返回一个series的布尔数据,重复的数据为True
print(df[result]) 提取重复的数据 ,逻辑为真的返回dataframe
index | a | b |
---|---|---|
0 | 1 | 1 |
1 | 1 | 2 |
2 | 3 | 2 |
去除存在列数据一样的行后:
index | a | b |
---|---|---|
1 | 1 | 2 |
2 | 3 | 2 |
实现代码:
pythondf = pd.DataFrame(dic) (df) (df.loc[~(df[] == df[])])
涉及到一些数据量略大一点,用pd.read_csv()读取数据似乎比较慢,经过测试 使用hdf5文件类型速度快大约10倍。 除此之外,将数据保存为pickle格式(二进制),读取速度也是非常快。
将dataframe保存为h5格式
pythonstore = pd.HDFStore("E:\\gps2020_9.h5")
store['df'] = data # data是 dataframe
store.close()
读取h5格式的文件
pythondata = pd.read_hdf(hdf_fp, key='df') # key是自己指定的 ,键的值可以自定义 类似与metadata 比较像namespace
关于pandas时间处理, 由于很多数据带有时间字段, 通常会提取某段时间数据,除了上面提到的方法,还可以通过pandas的api转换object的类型为 datetime.datetime
pythondata['RECDATETIME'] = pd.to_datetime(data['RECDATETIME'])
关于时间戳转换问题,需要将正常时间转换为unix时间戳。
第一种:
data['RECDATETIME'] = pd.to_datetime(data['RECDATETIME']).map(pd.Timestamp.timestamp)
第二种:
['RECDATETIME'] = (data['RECDATETIME'].astype(int)/10**9).astype('int')
pandas 分类处理: 有时候数据需要根据某个字段名分类,比如全校的成绩表,根据班级不同分班处理
pythongroup = data.groupby('STATIONSEQNUM') # 根据 stationseqnum分类 实际上可以传入一个列表,根据多字段分类
lon = group['LONGITUDE'].agg([np.mean]) # agg 聚合,得到某类的均值 或者 最值
print(group.groups) # 查看分类情况
dataframe 拼接: 由于用的不多,需要的时候再添加
pythondf = pd.concat([lon, lat], axis=1) # 按列拼接
df = pd.concat([lon, lat]) # 按行拼接
注意 : pd.contact 不考虑 index 只管拼接 , merge join这些属于合并,会考虑索引对齐 填充等问题
pythondf.rename(columns={'mean': 'LONGITUDE', 'mean1': 'LATITUDE'}, inplace=True)
无论是dataframe 还是 serious数据类型都有loc方法,根据index进行切片(默认的index是数字),且两边都是闭区间。 df.loc[row1
,col1] , 注意:使用的是中括号python>>>df
a b c d
1 -0.172949 0.768195 -0.379333 0.658013
2 0.773844 -0.732390 0.589150 0.395631
3 0.204580 -0.937462 0.916332 -0.424054
4 0.641465 1.603234 1.458837 0.373705
5 -1.204567 -1.188565 1.592697 1.871696
6 0.438288 -0.815811 0.592899 0.793396
>>>print(df.loc['2':'4', 'a'])
2 0.773844
3 0.204580
4 0.641465
Name: a, dtype: float64
# 用于筛选数据
>>>df
a b c
x 1 2 3
y 2 1 3
z 2 4 6
>>>print(df.loc[(df['a']>1) & (df['b']>1)])
a b c
z 2 4 6
有时候在处理数据的时候,不小心产生了很多unnmaed列,如果没有作用,会占用不少内存,如果要去除:
.data = data.loc[:, ~data.columns.str.contains("^Unnamed")]
根据不同的列进行先后排序,可以先排序‘productid’的字段,再排序时间字段
e.g:
data = data.sort_values(by=['PRODUCTID', 'RECDATETIME'])
本文作者:James
本文链接:
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!