本节总结pandas数据处理的操作,数据处理是pandas是最核心的功能,可以高效快捷地批量处理数据。类似于Excel中的数据清洗。
一、数据清洗
- 缺失值处理
- 检查缺失值
df.isnull().sum(axis=0) # 查看每列缺失值个数
df['A'].isnull() # 查看缺失值,是返回True,不是返回False
df.shape[0] - df.isnull().sum(axis=0) # 查看每列非缺失值个数
df.isna().sum() # 查看各列缺失值数
df.isna().mean()# 查看各列缺失值所占百分比
- 删除
df.dropna(axis=0) # 删除存在缺失值的行
df[~df['A'].isin([np.nan, None])] # 删除某列存在缺失值的行
df.dropna(axis=0, how='all') # 删除该行全部为缺失值的行
df.dropna(axis=0, thresh=10) # 删除非空值少于10个的行
df.dropna(axis='colimns')#删除含有缺失数据的列
df.dropna(thresh=len(df)*0.9, axis='colimns')#删除缺失数据占总体超过10%的列
- 填充
# 固定值填充
df.fillna(5)
df.fillna({'A': 5, 'B': 6})
# 邻近值填充
df.fillna(method='ffill') # 用上面最近且不为nan的值填充
df.fillna(method='bfill') # 用下面最近且不为nan的值填充
# 统计值填充
df.fillna(df.maen())
df.fillna(df.max())
- 转换
# NaN转换为None
df.where(pd.notnull(df), None)
- 重复值处理
- 查看重复值
df.duplicated(['A', 'B']).value_counts() # 查看重复值个数
df[df.duplicated()] # 查看重复值的第一条
- 处理重复值
# 根据A, B列去重,保留第一行(first/last)
df.drop_duplicates(subset=['A', 'B'], keep='first')
- 异常值处理(空格)
- 清除空格
# 去除前后空格
df['A'] = df['A'].str.strip()
- 查看异常值
# 使用箱线图检查异常值
sns.boxplot(y=data)
sns.stripplot(y=data, color='orange', jitter=0.2, size=2.5)
- 清除异常值
# 使用正态分布2倍标准差去除异常值
up = data.mean() + 2 * data.std()
down = data.mean() - 2 * data.std()
data = data.loc[(data > down) & (data < up)]
# 使用四分位数IQR去除异常值
q1 = data.quantile(q=0.25)
q3 = data.quantile(q=0.75)
up = q3 + 1.5 * (q3 - q1)
down = q1 - 1.5 * (q3 - q1)
data = data.loc[(data > down) & (data < up)]
二、数据转换
- 索引设置
- 添加/重命名索引
# 添加(全部重命名)索引
df.columns = ['A', 'B']
df.index = ['a', 'b']
# 部分重命名
df.rename(columns={'A': 'a', 'B': 'b'}, index={1: 11, 2: 22})
- 重置索引
# 指定A, B列为索引列,原来的索引变为列
df.reset_index(drop=False) # 重置为默认索引, 原来的索引变为列
- 索引去重
# 输出去重后的索引
df.index.unique()
- 复合索引
# 创建复合索引
df.set_index(['A', 'B'], drop=False)
# 复合索引取值
df.loc['外层索引'] # 得到dsf类型
df.loc['外层索引'].loc['内层索引'] # 得到series
# 内外层索引交换
df.swaplevel()
# 恢复单索引
df.reset_index(level=0, drop=False) # 外层仍为索引,内层恢复为列
- 数据类型及转换
- 查看数据类型
# 查看数据类型
df.dtypes
- 数据类型转换
# 数据类型转换:int64/int32/float64/float32/object/datetime64/str
df.astype('int64’)
df.astype({'列1':'float','列2':'float'})
- 常见数据类型操作
# 字符串(使用.str.字符串的任何方法,但是注意nan会变成字符串,记得替换回来)
df['A'].astype('str').str.strip().replace('nan', np.nan) #去除空格
# 数值
df.round(2) # 保留两位小数
df.round({'A': 1, 'B': 0}) # A列保留1位,B列保留0位(0位也还是小数类型)
# 时间
df['time'] = pd.to_datetime(df['time'], '%Y-%m-%d') # 字符串转化为时间
df['年月'] = df['time'].dt.strftime('%Y-%m') # 时间变为字符串
- 形状重构
df.values.reshape([3, 2]) # 转化为3行两列的数组
df.to_dict(orient='dict') # {'a': {}, 'b': {}}
df.to_dict(orient='list') # {'a': [], 'b': []}
df.to_dict(orient='series') # {'a': 1, 'b': 2}
df.to_dict(orient='records') # [{}, {}, {}]
[tuple(x) for x in df.values] # [(), (), ()]
- 排序
- 排序
# 按值排序(按score升序,按age降序,nan排在最前面(默认最后面))
df.sort_values(by=['score', 'age'], ascending=[True, False], na_position='first')
# 按索引排序(升序)
df.sort_index(ascending=True)
- 排行
# 中国式排名(从大到小,值相同排名相同,排名连续)
df['rank'] = df['score'].rank(ascending=False, method='dense')
三、数据拆分(分列)
- 字符串字段拆分
# 按位置拆分拆分
df['A'] = df['A'].str.slice(0, 3) # [0, 3)
# 按分隔符拆分
df['A'] = df['A'].str.split('_', expand=True)
- 列表字段拆分
# 列表字段拆分
df_new = df['A'].apply(pd.Series)
pd.concat([df, df_new], axis='columns')
- 时间字段拆分
# 时间字段拆分(year/month/weekday/day/hour/minute/second)
df['year'] = df['time'].dt.year
四、数据合并
- 合并字段
# 合并字段
df['name_score'] = df['name'] + '_' + df['score']
- 合并记录
# 合并记录(axis=0上下拼接;ignore重置索引;缺失值自动填充为nan)
pd.concat([df1, df2], axis=0, ignore_index=True)
- 关联合并(sql:join excel:vlookup)
# 关联合并(how:left/right/inner/outer)
pd.merge(df1, df2, how='left', on='name')
pd.merge(df1, df2, how='left', left_on='name', right_on='name2') # 两表关联字段名不同
pd.merge(df1, df2, how='left', left_on=True, right_on=True) # 把索引当作连接条件
pd.merge(df1, df2, how='left', on=['name', 'name2']) # 根据两个字段关联
五、数据抽取
- 抽取某列中的数字(extract支持正则表达式)
data['evaluate'] = data['evaluate'].str.extract(r'(\d+)', expand=True).astype('int64')
最后修改时间:2020-07-08 18:35:11
「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。
评论
相关阅读
[MYSQL] 服务器出现大量的TIME_WAIT, 每天凌晨就清零了
大大刺猬
175次阅读
2025-04-01 16:20:44
MCP+Hologres+LLM 搭建数据分析 Agent
阿里云大数据AI技术
141次阅读
2025-03-24 11:43:04
官宣,Milvus SDK v2发布!原生异步接口、支持MCP、性能提升
ZILLIZ
114次阅读
2025-04-02 09:34:13
[MYSQL] query_id和STATEMENT_ID在不同OS上的关系
大大刺猬
85次阅读
2025-03-26 19:08:13
用友畅捷通基于阿里云 MaxCompute 搭建智能数仓的落地实践
阿里云大数据AI技术
70次阅读
2025-04-09 09:58:18
什么是 OLAP 数据库?企业如何选择适合自己的分析工具
镜舟科技
48次阅读
2025-03-29 20:34:09
新发布 | 时序数据分析 AI 智能体来啦!
TDengine
48次阅读
2025-03-25 10:37:40
WingPro for Mac 强大的Python开发工具 v10.0.9注册激活版
一梦江湖远
45次阅读
2025-03-29 10:33:27
python操作MySQL数据库
怀念和想念
42次阅读
2025-03-30 23:22:07
【活动回顾】StarRocks Singapore Meetup #2 @Shopee
StarRocks
40次阅读
2025-03-27 10:22:40
TA的专栏
Java中间件
收录0篇内容
热门文章
一次Connection reset by peer的问题排查
2021-12-07 33921浏览
Java8-Stream: no instance(s) of type variable(s) R exist so that void conforms to R
2021-02-19 32349浏览
nginx: [emerg] "user" directive is not allowed here in /etc/nginx/conf.d/nginx.conf:1
2022-02-15 24257浏览
ORA-00904: "POLTYP": invalid identifier
2019-06-19 12928浏览
PageHelper排坑,处理排序失败: net.sf.jsqlparser.JSQLParserException
2022-05-19 12768浏览