data.dtypes # 展示各字段及其数据类型
data.info() # 比dtypes多一列,还可展示各字段数据量
# 查看数据框形状大小
data.shape
# 查看表的所有列名
data.columns
# 查看表的索引
data.index
# 查看各字段数据大小、均值、标准差、最小值、上四分位点、中间值、下四分位点、最大值
data.describe()
'————第一步:探索重复数据————'
# 探索完全相同的行数据
data.duplicated().sum()
'————第二步:处理缺失数据(删除)————'
# 删除所有字段完全相同的数据
data.drop_duplicates()
# 若有n条重复数据,保留最后一条重复数据
data.drop_duplicates(keep='last')
# 按照指定字段去重
# 单列
data.drop_duplicates(subset='列名1',inplace=True)
# 多列
data.drop_duplicates(subset=['列名1','列名2'],inplace=True) # inplace=True在原数据上删除
'————第一步:探索缺失数据————'
# 统计每一列字段缺失值的个数
data.isnull().sum()
# 统计每列字段缺失比例
data.apply(lambda x: str(round(sum(x.isnull())/len(x)*100,2))+'%' , axis= 0)
'————第二步:处理缺失数据————'
'————删除————'
# 默认删除只要存在一个缺失值的行
data.dropna()
# 删除所有元素都是缺失值的列
data.dropna(axis=1,how='all') # any:只要有缺失,就删除这一行
# 指定字段删除缺失值
data.dropna(subset=['字段名'],axis=0)
'————填补————'
# 指定值填补
data['列名'] = data['列名'].fillna('填补的数据')
# 均值填补
data['列名'] = data['列名'].fillna(data['列名'].mean())
# 中位数填补
data['列名'] = data['列名'].fillna(data['列名'].median())
# 众数填补
data['列名'] = data['列名'].fillna(data['列名'].mode()[0])
# 指定多列同时填补
data.fillna(value = {'第一列_众数' :某列.mode ()[0],'第二列_均值':某列.mean()})
# 用后一个数据填补
data.fillna(method='backfill')
# 用前一个数据填补
data.fillna(method='pad')
'————插值————'
# 线性等距插值:用缺失值上下值的平均值填充
data['列名'] = data['列名'].fillna(data['列名'].interpolate())
# 连续插值:选用前一个值来填充
data['列名'] = data['列名'].fillna(data['列名'].interpolate(method="pad"))
'————探索异常数据————'
# 展现数据情况
data['列名'].value_counts()
# 箱线图
import matplotlib.pyplot as plt
plt.boxplot(data['列名'])
plt.show()
data['列名'] = data['列名'].str.replace(r'[^\u4e00-\u9fa5]','')
# 将不要的字符替换为空
data['列名'] = data['列名'].apply(lambda x:x.replace('不要的字符',''))
# 若一次替换完成不了,可多次replace
data['列名'] = data['列名'].apply(lambda x:x.replace('不要的字符','').replace('不要的字符',''))
# 单个
data['列名'] = data['列名'].str[7]
# 多个(切片)
data['列名'] = data['列名'].str[0:2]
'————转换为时间数据————'
# 最简单转换
data['列名'] = pd.to_datetime(data['列名'])
# format设置时间格式
data['列名'] = pd.to_datetime(data['列名'], format='%Y%m%d')
# 用逗号分隔此字段数据,用于文本处理
data['列名'].str.split(',')
# 计算字符串长度
data['列名'].str.len()
# 显示前3行
data['列名'].head(3)
# 转换为float数据
data['列名'] = data['列名'].astype(float)
data['年'] = data['日期'].dt.year
data['月'] = data['日期'].dt.month
data['日'] = data['日期'].dt.day
data['季度'] = data['日期'].dt.quarter
data['星期几'] = data['日期'].dt.dayofweek
data['周次'] = data['日期'].dt.week
data['时'] = data['日期'].dt.hour
data['分'] = data['日期'].dt.minute
data['秒'] = data['日期'].dt.second
'————date用法————'
# 定义date对象
day = date(2022,11,12)
# 昨天
yesterday = day + timedelta(days=-1)
# 明天
tomorrow = day + timedelta(days=1)
print('昨天:',yesterday)
print('明天:',tomorrow)
————————————————————————————————
Output:
昨天: 2022-11-11
明天: 2022-11-13
'————datetime用法————'
# 定义datetime对象
day = datetime(2022,11,12,23,59,59)
# 昨天
yesterday = day + timedelta(days=-1)
# 明天
tomorrow = day + timedelta(days=1)
# 上一个小时
last_hour = day + timedelta(hours=-1)
# 下一个小时
next_hour = day + timedelta(hours=1)
# 上一秒
last_m = day + timedelta(seconds=-1)
# 下一秒
next_m = day + timedelta(seconds=1)
print('昨天:',yesterday)
print('明天:',tomorrow)
print('上一个小时:',last_hour)
print('下一个小时:',next_hour)
print('上一秒:',last_m)
print('下一秒:',next_m)
————————————————————————————————
Output:
昨天: 2022-11-11 23:59:59
明天: 2022-11-13 23:59:59
上一个小时: 2022-11-12 22:59:59
下一个小时: 2022-11-13 00:59:59
上一秒: 2022-11-12 23:59:58
下一秒: 2022-11-13 00:00:00
# 提取间隔天数
(tomorrow - yesterday).days
————————————————————————————————
Output:
2
调用chinese_calendar库中的is_workday、is_holiday、is_in_lieu模块,判断目标日期是否为工作日、节假日、调休日。返回的是一个布尔值。
import datetime
from chinese_calendar import is_workday # 判断是否为工作日
from chinese_calendar import is_holiday # 判断是否为节假日
from chinese_calendar import is_in_lieu # 判断是否为调休日
day = datetime(2022,11,12,23,59,59) # 11月12日是星期六
print(is_workday(day))
print(is_holiday(day))
print(is_in_lieu(day))
————————————————————————————————
Output:
False
True
False
date和datetime类型都可用weekday方法判断目标日期是星期几。0~6分别对应星期一至星期天。
# 11月12日是星期六
day = datetime(2022,11,12,23,59,59)
day.weekday()
————————————————————————————————
Output:
5