2024-09-18
数据处理
0

目录

pandas 常用操作
读取数据
查看数据信息
清洗数据
填充与替换数据
提取或去除特定的数据
大文件处理
时间处理
分类处理
数据拼接
更改列名
切片操作
分组排序

pandas 常用操作

本文写于大二,由于原博客网站到期,文章尘封已久。现重新排版,对文章进行勘误和加入新的内容。

pandas是一个python的数据处理库,一般搭配numpy使用。在pandas当中数据被抽象成excel表格,使用一种 Dataframe的数据类型。类似一个excel表格,有列名,有索引。经常我们会访问某一列的数据,直接使用列名就可以访问 Dataframe['longitude'], 不过返回的是Series类的数据 ,为了方便操作,可以使用data.values直接转换成 数组类型.(很方便配合matpylotlib绘图!!!)大部分的函数操作都是围绕表格的行或列进行操作,以下是总结的一些常用函数操作。不必记住,需要的时候查询即可。

读取数据

通常数据储存在csv或者excel中,调用数据集如下:

python
import pandas as pd # 导入模块 data = pd.read_csv() # 读取csv data2 = pd.read_excel() # 读取xls 或者 xlsx

查看数据信息

python
print(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’列唯一数据

清洗数据

填充与替换数据

python
pd.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
indexab
011
112
232

去除存在列数据一样的行后:

indexab
112
232

实现代码:

python
df = pd.DataFrame(dic) (df) (df.loc[~(df[] == df[])])

大文件处理

涉及到一些数据量略大一点,用pd.read_csv()读取数据似乎比较慢,经过测试 使用hdf5文件类型速度快大约10倍。 除此之外,将数据保存为pickle格式(二进制),读取速度也是非常快。

将dataframe保存为h5格式

python
store = pd.HDFStore("E:\\gps2020_9.h5") store['df'] = data # data是 dataframe store.close()

读取h5格式的文件

python
data = pd.read_hdf(hdf_fp, key='df') # key是自己指定的 ,键的值可以自定义 类似与metadata 比较像namespace

时间处理

关于pandas时间处理, 由于很多数据带有时间字段, 通常会提取某段时间数据,除了上面提到的方法,还可以通过pandas的api转换object的类型为 datetime.datetime

python
data['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 分类处理: 有时候数据需要根据某个字段名分类,比如全校的成绩表,根据班级不同分班处理

python
group = data.groupby('STATIONSEQNUM') # 根据 stationseqnum分类 实际上可以传入一个列表,根据多字段分类 lon = group['LONGITUDE'].agg([np.mean]) # agg 聚合,得到某类的均值 或者 最值 print(group.groups) # 查看分类情况

数据拼接

dataframe 拼接: 由于用的不多,需要的时候再添加

python
df = pd.concat([lon, lat], axis=1) # 按列拼接 df = pd.concat([lon, lat]) # 按行拼接

注意 : pd.contact 不考虑 index 只管拼接 , merge join这些属于合并,会考虑索引对齐 填充等问题

更改列名

python
df.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 许可协议。转载请注明出处!