python-数据分析-(10)pandas时间处理、字符串处理、分组聚合、去重排序常见操作

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

一、时间处理

  1. 时间类型转换
# 将字符串类型转换为标准时间格式
# 一般来说,先将字符串转换为datetime类型,再重新放入到表当中
data1 = data['place_order_time']  # 一般来说文件中的都是字符串
data['place_order_time'] = pd.to_datetime(data1)
print(data['place_order_time'].dtypes)   # dtype: datetime64[ns]
  1. 时间类型提取
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   # 将时间中的小时,生成新的一列
  1. 时间运算
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]
  1. 时间推移运算 整数+时间戳
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. 基本语法
分组键:
1 确认分组条件: 分组键
2 聚合函数
data.groupby(by='order_id')[['amounts', 'counts']].sum().head()
             分组键          显示字段           聚合函数  分组后条件
  1. 每个订单应付的金额?
# sort_values(by='counts') 是对分组的进行排序, 需要注意,如果是Series,就不用在sort_values中添加by=‘’!!
print(data.groupby(by='order_id')[['amounts', 'counts']].sum().sort_values(by='counts'))  # ascending
  1. 聚合
(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

  1. 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   
  1. 字符串修饰
# 字符串的修饰,都延用了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去重是数据清洗中最为重要的一项,合理的使用可快速获取到数据

  1. Series 一维去重
# 基本语法
data['dishes_name'].unique    
data['dishes_name'].describe()['unique']
print(data['dishes_name'].drop_duplicates())    #  series中不用使用subset方法
  1. 二维,对多个列进行去重 当同时满足两个列才会去重
基本语法
#sort_values(by='')  对分组后的数据进行排序
print(data.drop_duplicates(subset='dishes_name').sort_values()
print(data.drop_duplicates(subset=['dishes_name', 'dishes_id']).sort_values()  # 二维中才能使用subset
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值