数据分析(pandas)---03.案例

import pandas as pd
'^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^读取csv文件,将字符串转为日期时间格式^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^6'
# 读取csv文件() seq分隔符 read_table或者read_csv 建议read_csv
order = pd.read_csv('C:\pyproject\day03\matplot_data\meal_order_info.csv',sep=',',encoding='gbk')
print(order)

# lock_time里的日期是字符串类型,需要转换成可以比较运算的时间戳类型
# 使用to_datetime()
order['lock_time'] = pd.to_datetime(order['lock_time'])
order['use_start_time']=pd.to_datetime(order['use_start_time'])

# 对整个表日期进行操作,pandas支持日期范围
print('最小的时间为:',pd.Timestamp.min)
print('最大的时间为:',pd.Timestamp.max)

# 年、月、日、星期
year = [i.year for i in order['lock_time']]
month = [i.month for i in order['lock_time']]
day = [i.day for i in order['lock_time']]
day_name = [i.day_name for i in order['lock_time']]
print('lock_time中的星期名称数据前五个:',day_name[:5])
print(type(day_name)) #<class 'list'>

# 操作
time_delta=order['lock_time']-pd.to_datetime('2017.1.1')
print('距离2017年1月1日0点0时0分后的数据',time_delta[:5])
print(time_delta.dtypes) #timedelta64[ns]

# 定义点餐时间
check_time = order['lock_time']-order['use_start_time']
print('用时最少的点餐时间为:',check_time.min()) #-1 days +00:05:00
print('用时最多的点餐时间为:',check_time.max()) #16 days 00:08:00
print('平均点餐时间为:',check_time.mean()) #0 days 01:12:07.500000


# 异常数据 去除空值、负值和标准差为0的数据
for i in range(order.shape[0]):
    if order['lock_time'][i]<order['use_start_time'][i]:
        # 找出异常数据所在行
        print(i)

'^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^读取xlsx文件,汇总多个表数据,删除异常数据^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^'
# 汇总多个表数据
from pandas import DataFrame
import xlrd

# 获取excel文件以及文件中的表名
wb = xlrd.open_workbook('C:\pyproject\day03\matplot_data\meal_order_detail.xlsx')
sheet = wb.sheet_names()
print(sheet)  #['meal_order_detail1', 'meal_order_detail2', 'meal_order_detail3']


# 总的数据容器
total = DataFrame()
# 循环遍历所有sheet,汇总数据,index_col 让第几列为索引
for i in range(len(sheet)):
    data = pd.read_excel('C:\pyproject\day03\matplot_data\meal_order_detail.xlsx',sheet_name=i,index_col=False)
    print(type(data))

    # 汇总数据
    total = total.append(data)

# 保存
writer = pd.ExcelWriter('output.xlsx')
total.to_excel(writer,'Sheet1')
writer.save()

'~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~餐饮数据分析~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~'
detail = pd.read_excel('output.xlsx')
# 公共属性值
print(type(detail)) #<class 'pandas.core.frame.DataFrame'>
print(detail.shape) #(10037, 19)
print(detail.size)  #190703
print(detail.ndim)  #2

# 取一列数据,
# 只有一列,是序列类型,可以当做ndarray访问
# 格式:表名['列名']
amounts = detail['amounts']
counts = detail['counts']
# 对某一列的某几行访问:访问 DataFrame 中某一列的某几行时,单独一列的 DataFrame 可以视为一个 Series(另一种 pandas 提供的类,可以看作是只有一列的 DataFrame), 而访问一个 Series 基本和访问一个一维的 ndarray 相同。

# 取多列数据
# 格式: 表名[['列名1','列名2',....]]
detail_ac=detail[['amounts','counts']]
print('订单详情表中counts和amounts两列的描述性统计信息为:',detail_ac.describe())

# 关于行的读取
# 格式 :  表名.loc[行,列]
detail_ac = detail.loc[:5,['amounts','counts']]
print('前5行的数据:\n',detail_ac)

# 类别,将相同的值作为一类
print(detail['order_id'])
print(detail['dishes_name'])
detail['order_id'] = detail['order_id'].astype('category')
detail['dishes_name'] = detail['dishes_name'].astype('category')
print(detail['order_id'])
print(detail['dishes_name'])
print('订单详情表中关于order_id(订单编号)'
      '与dishes_name(菜品名称)的描述性统计结果为:\n',
      detail[['order_id','dishes_name']])

'``````````````````````````````订单数据剔除空值与相同值```````````````````````````````````````'
col = detail.shape[1]
print('原始数据中心列的个数',col) #20

# 获取所有列属性对应的describe,返回布尔值
# loc方法,传入的是索引名称
colisNull = detail.describe().loc['count'] == 0
print(colisNull)
print(type(colisNull)) #序列

# 去除全为空值的列和标准差为0的列
# 1.剔除空值
for i in range(len(colisNull)):
    if colisNull[i]:
        detail.drop(colisNull.index[i],axis=1,inplace=True)

# 2.剔除0值
stdisZero = detail.describe().loc['std'] == 0
for i in range(len(stdisZero)):
    if stdisZero[i]:
        detail.drop(stdisZero.index[i],axis=1,inplace=True)

print('剔除空值后列的个数',detail.shape[1]) #10
print(detail.describe())


相关文章

转载:一文讲述Pandas库的数据读取、数据获取、数据拼接、数...
Pandas是一个开源的第三方Python库,从Numpy和Matplotlib的基...
整体流程登录天池在线编程环境导入pandas和xrld操作EXCEL文件...
 一、numpy小结             二、pandas2.1为...
1、时间偏移DateOffset对象DateOffset类似于时间差Timedelta...
1、pandas内置样式空值高亮highlight_null最大最小值高亮背景...