作者 | 小F

来源 | 法纳斯特(walker398)

数据整合是对数据进行行列选择、创建、删除等操作。

数据清洗则是将整合好的数据去除其中的错误和异常。

本文利用之前获取的网易云音乐用户数据,来简单讲一下Pandas的用法,以便以后能更好的使用。

1、数据整合

首先读取数据。

import numpy as np

import pandas as pd

import matplotlib.pyplot as plt

# 设置列名与数据对齐

pd.set_option('display.unicode.ambiguous_as_wide', True)

pd.set_option('display.unicode.east_asian_width', True)

# 显示所有列

pd.set_option('display.max_columns', None)

# 显示10行

pd.set_option('display.max_rows', 10)

# 设置显示宽度为1000,这样就不会在IDE的输出框中换行了

pd.set_option('display.width', 1000)

# 读取数据

df = pd.read_excel('data.xlsx', header=None, names=['name', 'user_id', 'age', 'gender', 'city', 'praise', 'date'], encoding='utf-8-sig', skipinitialspace=True)

print(df)

01 行列操作

选择单列。可以直接用列名选择,也可以通过ix、iloc、loc方法进行选择行、列。

ix方法可以使用数值或者字符作为索引来选择行、列。

iloc则只能使用数值作为索引来选择行、列。

loc方法在选择列时只能使用字符索引。

# 返回pandas序列结构的类

print(df['age'])

print(df.age)

print(df.ix[:, 'age'])

print(df.loc[:, 'age'])

# 返回pandas数据框类

print(df[['age']])

print(df.iloc[:, 2:3])

输出结果。

选择多列。ix、iloc、loc方法都可使用。

只不过ix和loc方法,行索引是前后都包括的,而列索引则是前包后不包(与列表索引一致)。

iloc方法则和列表索引一致,前包后不包。

# 列索引前包后包

print(df.ix[0:5, 0:5])

print(df.loc[0:5, ('name', 'user_id', 'age', 'gender', 'city')])# 列索引前包后不包

print(df.iloc[0:5, 0:5])

# 列索引前包后包

print(df.ix[0:5, 0:5])

print(df.loc[0:5, ('name', 'user_id', 'age', 'gender', 'city')])# 列索引前包后不包

print(df.iloc[0:5, 0:5])

输出结果。

创建列。可以直接通过赋值完成,也可通过数据框的assign来完成赋值,不过后一种方法需要赋值给新表才能生效。

# 直接列赋值

df['adult'] = df['age'] // 18

print(df)# 使用assign赋值

df = df.assign(adult=df['age'] // 18)

print(df)

# 直接列赋值

df['adult'] = df['age'] // 18

print(df)# 使用assign赋值

df = df.assign(adult=df['age'] // 18)

print(df)

两个方法的输出结果都一样。

删除列。使用数据框的方法drop。

# 删除单列

print(df.drop('date', axis=1))# 删除多列

print(df.drop(['praise', 'date'], axis=1))

输出结果。

02 条件查询

单条件查询。使用比较运算符进行查询,如「==  >  =  <= !=」。生成bool索引。

# 生成bool索引

print(df.age > 17)# 返回符合条件的数据

print(df[df.age > 17])

输出结果,这里以年龄大于18岁为例。

多条件查询。无非就是加个逻辑运算符。如「&  ~  |」,代表了与、非、或。

# 筛选年龄成年且性别为女性的用户

print(df[(df.age > 17) & (df.gender == 2)])# 筛选评论点赞数不为0的用户

print(df[~(df.praise == 0)])# 筛选地区在河南或湖南的用户

print(df[(df.city == 430100) | (df.city == 410100)])

输出结果。

当然Pandas还提供了更方便的条件查询方法,比如query、between、isin、str.contains(匹配开头)。

使用query进行条件查询。

# 筛选成年用户

print(df.query('age > 17'))# 筛选地区在河南或湖南的用户

print(df.query('(city == 430100) | (city == 410100)'))

输出结果。

between方法,查询数据在某个范围的记录。

# 查询18到25岁的用户数据,inclusive为True意思是将边界包括在内

print(df[df['age'].between(18, 25, inclusive=True)])

输出结果。

对于字符串来说,可以使用isin方法进行查询。

# 查询在某个时间评论的用户情况

print(df[df['date'].isin(['2019-03-11 16:19:00', '2019-03-11 16:00:00'])])

输出结果。

03 横向连接

Pandas提供了merge方法来完成各种表的横向连接操作。其中包括内连接、外连接。

内连接,根据公共字段保留两表共有的信息。

# 表1

df1 = df.iloc[0:10, 0:2]

print(df1)# 表2

df2 = df.iloc[0:10, 1:7]

print(df2)

两表数据如下。

两表横向连接代码如下。

# 公共字段名称一致时

print(df1.merge(df2, how='inner', on='user_id'))# 公共字段名称不一致时

print(df1.merge(df2, how='inner', left_on='user_id', right_on='user_id'))

输出结果。

外连接包括左连接、右连接、全连接。

哪边连接,哪边的信息全保留,另一边的缺失信息会以NaN补全。

how的参数值分别为left、right、outer。

04 纵向连接

数据的纵向合并指的是将两张或多张表纵向拼接起来,使得原先两张或多张表的数据整合到一张表上。

# 表1

df1 = df.iloc[0:10, :]

print(df1)# 表2

df2 = df.iloc[8:15, :]

print(df2)

两表数据如下。

pd.concat方法不仅可以完成纵向合并,还能完成横向合并。

当参数axis的值为0时,纵向合并。

当参数axis的值为1时,横向合并。

# ignore_index=True表示忽略两表原先的行索引,合并并重新排序索引,drop_duplicates()表示去重

print(pd.concat([df1, df2], ignore_index=True, axis=0).drop_duplicates())

输出结果。

05 排序

Pandas的排序方法有以下三种。

sort_values、sort_index、sortlevel。

第一个表示按值排序,第二个表示按索引排序,第三个表示按级别排序。

# 按用户年龄降序排序,last表示缺失值数据排在最后面(first)

print(df.sort_values('age', ascending=False, na_position='last'))# 多个排序变量,这里以性别和年龄(有先后顺序)

print(df.sort_values(['gender', 'age'], ascending=False, na_position='last'))

输出结果。

06 分组汇总

groupby方法可以进行分组汇总。agg方法则可一次汇总多个统计量。

# 对性别分组,汇总点赞数,获取点赞数最大值

print(df.groupby('gender')[['praise']].max())# 对性别和年龄分组,获取点赞数的平均值

print(df.groupby(['gender', 'age'])[['praise']].mean())# 对性别分组,获取点赞数和年龄的平均值

print(df.groupby(['gender'])[['praise', 'age']].mean())# 对性别分组,获取性别的计数值

print(df.groupby(['gender'])[['gender']].count())# 多重索引

print(df.groupby(['gender', 'date'])['age', 'praise'].agg(['mean', 'max', 'min', 'count']))

输出结果,这里只展示计数的结果,也是平常用的比较多的。

通过上面的数值,就能绘制出用户性别分布情况的饼图。

07 赋值与条件赋值

# 将某个值替换

print(df.praise.replace(33, np.nan))

条件赋值。这里以性别列为例,将0,1,2替换为未知、男性、女性。

def transform(row):

"""

标识性别

"""

if row['gender'] == 1:

return ('男性')

elif row['gender'] == 2:

return ('女性')

else:

return ('未知')# axis=1为列循环,axis=0为行循环

print(df.apply(transform, axis=1))# 赋值到新列

print(df.assign(gender_c=df.apply(transform, axis=1)))

输出结果。

除了apply方法,还可以通过条件查询直接赋值。

df = df.copy()

df.loc[df.gender == 0, 'gender_c'] = '未知'

df.loc[df.gender == 1, 'gender_c'] = '男性'

df.loc[df.gender == 2, 'gender_c'] = '女性'

print(df)

输出结果,和上图一样。

2、数据清洗

01 重复值处理

Pandas提供了查看和删除重复数据的方法,具体如下。

# 查看重复的数据

print(df[df.duplicated()])# 删除重复的数据

print(df.drop_duplicates())# 去除用户ID重复的所有记录

print(df.drop_duplicates('user_id'))

输出结果如下,分别对应查看,删除,特定列删除。

02 缺失值处理

Pandas提供了fillna方法用于替换缺失值数据。

# sum(col.isnull())表示当前列有多少缺失,col.size表示当前列总共有多少行数据

print(df.apply(lambda col: sum(col.isnull())/col.size))

首先查看各列的缺失情况。

填补缺失值数据,将昵称缺失值设置为未知。

# 填补缺失值

print(df.name.fillna('未知'))

输出结果。

还可以调用方法isnull产生缺失值指示变量。

# 默认的bool类型

print(df.name.isnull())# 数值0、1型指示变量

print(df.name.isnull().apply(int))

输出结果。

03 数据分箱

分箱法包括等深分箱(每个分箱样本数量一致)和等宽分箱(每个分箱的取值范围一致)。

其中Pandas的qcut函数提供了分箱的实现方法,默认是实现等宽分箱。

# 等宽分箱

print(pd.cut(df.age, 5))# 自定义标签

print(pd.cut(df.age, bins=5, labels=[10, 15, 20, 25, 30]))

这里以年龄为例,输出如下。

实现等深分箱,其中每个箱的宽度可能不一。

# 去除没有年龄数据的用户

df = df[df.age != 0]# 输出等深度分2箱的分位数

print(df.age.quantile([0, 0.5, 1]))# include_lowest=True表示包含边界的最小值

print(pd.cut(df.age, bins=df.age.quantile([0, 0.5, 1]), include_lowest=True))

输出结果。

3、总结

有关Pandas的知识还很多,本次就到此为止。

python3爬取网易云歌单数据清洗_实例 | 使用网易云音乐数据演示数据整合与数据清洗...相关推荐

  1. python3爬取全民K歌

    Python3爬取全民k歌 环境 python3.5 + requests 1.通过歌曲主页链接爬取 首先打开歌曲主页,打开开发者工具(F12). 选择Network,点击播放,会发现有一个请求返回的 ...

  2. 05 爬取周杰伦所有歌单

    # Author:Nimo_Ding''' 目标: 爬取周杰伦所有歌单 ''' import requests url = 'https://c.y.qq.com/soso/fcgi-bin/clie ...

  3. python3爬取微博评论api情感分析_如何科学地蹭热点:用python爬虫获取热门微博评论并进行情感分析...

    param = (comment_id,user_name,created_at,text,likenum,source) try: A = cur.execute(sql,param) conn.c ...

  4. python爬取网易云歌单

    写在前面: 我的博客已迁移至自建服务器:博客传送门,CSDN博客暂时停止,如有机器学习方面的兴趣,欢迎来看一看. 此外目前我在gitHub上准备一些李航的<统计学习方法>的实现算法,目标将 ...

  5. 运用Python——爬取网易云歌单的全部歌曲热评_爬虫的简单应用

    导航 ·运用Python--爬虫_网易云音乐热评 ·运用Python--游戏_四子棋_劳拉下棋 文章目录 导航 1.展示截图 2.代码 3.分析 常量的定义.界面设计 依次爬取歌曲信息 创建表格 爬取 ...

  6. Java爬虫——爬取网易云歌单音乐添加到QQ音乐

    此博客仅为学习交流,如触及第三方利益,请及时联系本人删除 一.前言 看标题大家可能会有点疑惑,为什么要写这个看起来没什么作用的爬虫,两个音乐软件换着用不香吗?     基于此问题,我以我个人感受罗列了 ...

  7. java爬取网易云歌单_GitHub - th720309/163music_spider: 网易云音乐歌单爬取

    今天花了一点时间抓取了网易云音乐的热门民谣歌单,共1500热门民谣歌单,后续有时间会爬取其他分类. 下面记录一下java爬取过程.见下: 爬虫过程 1.首先抓取各个歌单的url与标题 public s ...

  8. Python爬虫爬取豆瓣TOP250和网易云歌单

    python爬虫(网易云)笔记 @(python学习) 先推荐看一下b站的视频链接如下:https://www.bilibili.com/video/BV12E411A7ZQ?from=search& ...

  9. 如何创建一个网易云歌单外链

                                  如何创建一个网易云歌单外链 首先打开网易云音乐,打开一个歌单或者自己创建一个歌单 点解生成外链播放器 这里可以选择iframe和flash两 ...

最新文章

  1. 硬核教程:五步掌握用VSCode进行高效Python开发
  2. 为什么要学习python
  3. 关于ASP.NET未能映射路径问题
  4. webpack+react+es6开发模式
  5. Spring Boot EasyUI edatagrid 扩展
  6. Keyboarding(信息学奥赛一本通-T1452)
  7. Linux字符串转换函数汇总
  8. 【Asp.Net从零开始】:使用缓存来提高网站性能 Caching(一)
  9. Excel的设置 .net
  10. 偏微分方程数值解法python_微分方程 | 常微分
  11. 从pdf简历中提取信息——BiLSTM-CRF
  12. C#莱姆达表达式的使用
  13. 海量的超赞 Linux 软件 (转载)
  14. Google Dremel 原理 - 如何能 3 秒分析 1PB
  15. 一步搞定无法审查元素
  16. 洛谷P1262 间谍网络题解
  17. 生物小分子耦合稀土上转换纳米颗粒
  18. CCI指标的计算公式
  19. 对话框AlertDialog的基本使用(新手)
  20. 【蓝桥杯】基础练习 杨辉三角形 Java

热门文章

  1. 猫扑网互动营销六大模式
  2. UiPath中Assign活动的作用是什么
  3. Tinkoff Internship Warmup Round 2018 and Codeforces Round #475 (Div. 2) C.Alternating Sum(等比数列求和)
  4. 驾校学车VIP班和普通班区别是什么?
  5. 你一定要用好的实用外贸工具(内附清单)
  6. 瑟瑟发抖,小白的python第一课——网络爬虫
  7. vsftpd设置被动模式_Vsftp安装及配置主动模式/被动模式
  8. 怎样用计算机计算分数除法,分数除法的计算方法
  9. 软银集团任命新董事 ARM与Sprint CEO正式进入董事会
  10. 南大通用数据库-Gbase-8a-学习-24-全文检索