pandas在数据清洗过程,难不了会特定的列或者行进行操作,就需要特殊的指令操作,在这里收集了常见的操作指令。希望能在工作中帮给您一定的帮助。
我这本文章中先导入包,读取了本地的一个文件,内容有字符串、时间。
# import导入模块
import pandas as pd
import numpy as np
# 读取Excel文件
data = pd.read_excel('./meal_order_detail.xlsx')
print(data.shape) # (2779, 19) 查看结构
print(data.dtypes) # 查看文件列的属性
place_order_time datetime64[ns] # 时间类型
add_inprice int64 # 整数
bar_code float64 # 浮点数
picture_file object # 字符串
dtype: object
一、时间处理
- 时间类型转换
# 将字符串类型转换为标准时间格式
# 一般来说,先将字符串转换为datetime类型,再重新放入到表当中
data1 = data['place_order_time'] # 一般来说文件中的都是字符串
data['place_order_time'] = pd.to_datetime(data1)
print(data['place_order_time'].dtypes) # dtype: datetime64[ns]
- 时间类型提取
ser.dt.时间属性
year 年 mouth 月
day 日 hour 时
minute 分 second 秒
date 日期 week 星期 一年当中第几个星期
dayofyear 一年中的第几天 day_name() 今天周几
is_leap_year 是否是闰年 。。。。
# 我收集的知识常用的指令,其他还有很多操作指令,可以看一下的标准文档,后续的指令的更新也是根据这个文档来的
https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.Series.str.startswith.html
print(data['place_order_time'].dt.year) # 获取年
print(data['place_order_time'].dt.day_name()) # 获取今天是周几
data['year'] = data['place_order_time'].dt.year # 将时间中的小时,生成新的一列
- 时间运算
time1 = data['place_order_time'].head() # 可以指定获取列的前五行
time2 = data['place_order_time'].tail().reset_index()['place_order_time'] # 重置索引,会将就的index添加一列,需要重新取值
print(time2-time1) # 使用time2 - time1 ,返回的是中间的差值
0 9 days 10:50:48.000005
1 9 days 10:49:40.999993
2 9 days 10:54:12.000003
3 9 days 10:52:47.000003
4 9 days 10:53:00.000007
Name: place_order_time, dtype: timedelta64[ns]
- 时间推移运算 整数+时间戳
weeks 星期 miliseconds 毫秒
days 天 hours 小时 minutes 分钟 seconds 秒
print(data['place_order_time'] + pd.Timedelta(days=1)) # 加一天
print(data['place_order_time'] + pd.Timedelta(hours=1)) # 加一小时
print(data['place_order_time'] - pd.Timedelta(minutes=5))# 减 5 分钟
二、分组聚合
- 基本语法
分组键:
1 确认分组条件: 分组键
2 聚合函数
data.groupby(by='order_id')[['amounts', 'counts']].sum().head()
分组键 显示字段 聚合函数 分组后条件
- 每个订单应付的金额?
# sort_values(by='counts') 是对分组的进行排序, 需要注意,如果是Series,就不用在sort_values中添加by=‘’!!
print(data.groupby(by='order_id')[['amounts', 'counts']].sum().sort_values(by='counts')) # ascending
- 聚合
(1)、 sum/mean/std/var
# 指定获取某些列进行聚合函数操作,如果Series则可以直接使用函数
data['amounts'].mean()
(2)、特殊函数完成聚合操作
# 如果是二维类型,则需要使用 agg 进行传参
print(data[['amounts', 'counts']].agg([np.sum, np.mean, np.std])) # 列表类型传参
print(data[['amounts', 'counts']].agg({'amounts': np.mean, 'counts': [np.sum, np.std]})) # 字典类型传参
print(data.groupby(by='order_id')[['amounts', 'counts']].agg([np.mean, np.sum])) # 分组数据聚合
三、字符串处理 Series
- info 查看表中列的信息
print(data.info())
# Column Non-Null Count Dtype
--- ------ -------------- -----
0 detail_id 2779 non-null int64
1 order_id 2779 non-null int64
2 dishes_id 2779 non-null int64
3 logicprn_name 0 non-null float64
4 parent_class_name 0 non-null float64
- 字符串修饰
# 字符串的修饰,都延用了python中字符串的修饰,所有的方法在pandas也是可以用的
# strip find center just split ....
print(data['dishes_name'].str.strip()) # 去重两边的空格
c = data['dishes_name'].str.contains('番茄') # 查找数据中包含'番茄'的行
print(data.loc[c, 'dishes_name'].str.strip()) # 使用切到的数据,在从原始表中获取数据
9 番茄有机花菜
16 番茄甘蓝
18 番茄炖秋葵
23 番茄炖牛腩
92 番茄甘蓝
...
四、pandas去重!
pandas去重是数据清洗中最为重要的一项,合理的使用可快速获取到数据
- Series 一维去重
# 基本语法
data['dishes_name'].unique
data['dishes_name'].describe()['unique']
print(data['dishes_name'].drop_duplicates()) # series中不用使用subset方法
- 二维,对多个列进行去重 当同时满足两个列才会去重
基本语法
#sort_values(by='') 对分组后的数据进行排序
print(data.drop_duplicates(subset='dishes_name').sort_values()
print(data.drop_duplicates(subset=['dishes_name', 'dishes_id']).sort_values() # 二维中才能使用subset