数据清洗(二):python数据清洗

python数据清洗

Pandas数据清洗流程:

  • 1.数据的读写:read_csv、read_excel、to_csv to_excel
  • 2.数据的探索与描述:info、head、describe、shape、value_counts
  • 3.数据的选择与整理:df索引、列的选取、显式loc、隐式iloc、掩码、映射函数map、apply
  • 4.数据的分组:groupby
  • 5.数据的分割、合并:索引、drop、pop、del、append、concat、merge
  • 6.缺失值、异常值、重复值的处理:fillna、drop_duplicates
  • 7.文本字符串的处理:series.str

1、数据的读取

%pwd  
# 魔法方法显示的是当前路径
'C:\\Users\\Administrator\\Desktop\\python\\机器学习案例汇总'
#导入相应的包
import numpy as np
import pandas as pd
#导入数据集
df = pd.read_csv('data/1.data清洗/taobao_data.csv',encoding='utf-8')
#查看数据集前2行
df.head() #默认查看前5行
宝贝 价格 成交量 卖家 位置
0 新款中老年女装春装雪纺打底衫妈妈装夏装中袖宽松上衣中年人t恤 99.0 16647 夏奈凤凰旗舰店 江苏
1 中老年女装清凉两件套妈妈装夏装大码短袖T恤上衣雪纺衫裙裤套装 286.0 14045 夏洛特的文艺 上海
2 母亲节衣服夏季妈妈装夏装套装短袖中年人40-50岁中老年女装T恤 298.0 13458 云新旗舰店 江苏
3 母亲节衣服中老年人春装女40岁50中年妈妈装套装夏装奶奶装两件套 279.0 13340 韶妃旗舰店 浙江
4 中老年女装春夏装裤大码 中年妇女40-50岁妈妈装夏装套装七分裤 59.0 12939 千百奈旗舰店 江苏
#查看数据集后3行
df.tail(3)
宝贝 价格 成交量 卖家 位置
97 母亲节妈妈装夏装套装女40-50岁夏季衣服两件套中老年春装连衣裙 195.0 4000 若澜锦蒂旗舰店 浙江
98 母亲节衣服夏季中老年女装夏装短袖套装雪纺衫T恤妈妈装两件套 498.0 3968 蕴涵旗舰店 江苏
99 中老年女装春装t恤纱袖针织衫40-50岁妈妈装七分袖上衣夏装打底衫 688.0 3956 潮流前线9170 浙江

2、数据的探索

#查看数据集形状
df.shape
(100, 5)
#快速了解数据的结构
df.info()

RangeIndex: 100 entries, 0 to 99
Data columns (total 5 columns):
 #   Column  Non-Null Count  Dtype  
---  ------  --------------  -----  
 0   宝贝      100 non-null    object 
 1   价格      100 non-null    float64
 2   成交量     100 non-null    int64  
 3   卖家      100 non-null    object 
 4   位置      100 non-null    object 
dtypes: float64(1), int64(1), object(3)
memory usage: 4.0+ KB
#快速查看数据的描述性统计信息
df.describe()
价格 成交量
count 100.000000 100.00000
mean 231.669000 6388.93000
std 130.971061 2770.07536
min 29.000000 3956.00000
25% 128.750000 4476.50000
50% 198.000000 5314.50000
75% 298.000000 7053.75000
max 698.000000 16647.00000

3、数据的选择与整理

行的选择 ——三种方法选取前5行

df.head()
宝贝 价格 成交量 卖家 位置
0 新款中老年女装春装雪纺打底衫妈妈装夏装中袖宽松上衣中年人t恤 99.0 16647 夏奈凤凰旗舰店 江苏
1 中老年女装清凉两件套妈妈装夏装大码短袖T恤上衣雪纺衫裙裤套装 286.0 14045 夏洛特的文艺 上海
2 母亲节衣服夏季妈妈装夏装套装短袖中年人40-50岁中老年女装T恤 298.0 13458 云新旗舰店 江苏
3 母亲节衣服中老年人春装女40岁50中年妈妈装套装夏装奶奶装两件套 279.0 13340 韶妃旗舰店 浙江
4 中老年女装春夏装裤大码 中年妇女40-50岁妈妈装夏装套装七分裤 59.0 12939 千百奈旗舰店 江苏
df[:5]  #选择0~4行
宝贝 价格 成交量 卖家 位置
0 新款中老年女装春装雪纺打底衫妈妈装夏装中袖宽松上衣中年人t恤 99.0 16647 夏奈凤凰旗舰店 江苏
1 中老年女装清凉两件套妈妈装夏装大码短袖T恤上衣雪纺衫裙裤套装 286.0 14045 夏洛特的文艺 上海
2 母亲节衣服夏季妈妈装夏装套装短袖中年人40-50岁中老年女装T恤 298.0 13458 云新旗舰店 江苏
3 母亲节衣服中老年人春装女40岁50中年妈妈装套装夏装奶奶装两件套 279.0 13340 韶妃旗舰店 浙江
4 中老年女装春夏装裤大码 中年妇女40-50岁妈妈装夏装套装七分裤 59.0 12939 千百奈旗舰店 江苏
df.iloc[0:5] #选择0~4行
宝贝 价格 成交量 卖家 位置
0 新款中老年女装春装雪纺打底衫妈妈装夏装中袖宽松上衣中年人t恤 99.0 16647 夏奈凤凰旗舰店 江苏
1 中老年女装清凉两件套妈妈装夏装大码短袖T恤上衣雪纺衫裙裤套装 286.0 14045 夏洛特的文艺 上海
2 母亲节衣服夏季妈妈装夏装套装短袖中年人40-50岁中老年女装T恤 298.0 13458 云新旗舰店 江苏
3 母亲节衣服中老年人春装女40岁50中年妈妈装套装夏装奶奶装两件套 279.0 13340 韶妃旗舰店 浙江
4 中老年女装春夏装裤大码 中年妇女40-50岁妈妈装夏装套装七分裤 59.0 12939 千百奈旗舰店 江苏
df.iloc[:5,:] #选择前5行
宝贝 价格 成交量 卖家 位置
0 新款中老年女装春装雪纺打底衫妈妈装夏装中袖宽松上衣中年人t恤 99.0 16647 夏奈凤凰旗舰店 江苏
1 中老年女装清凉两件套妈妈装夏装大码短袖T恤上衣雪纺衫裙裤套装 286.0 14045 夏洛特的文艺 上海
2 母亲节衣服夏季妈妈装夏装套装短袖中年人40-50岁中老年女装T恤 298.0 13458 云新旗舰店 江苏
3 母亲节衣服中老年人春装女40岁50中年妈妈装套装夏装奶奶装两件套 279.0 13340 韶妃旗舰店 浙江
4 中老年女装春夏装裤大码 中年妇女40-50岁妈妈装夏装套装七分裤 59.0 12939 千百奈旗舰店 江苏
df.loc[:4,:] #选择前5行
宝贝 价格 成交量 卖家 位置
0 新款中老年女装春装雪纺打底衫妈妈装夏装中袖宽松上衣中年人t恤 99.0 16647 夏奈凤凰旗舰店 江苏
1 中老年女装清凉两件套妈妈装夏装大码短袖T恤上衣雪纺衫裙裤套装 286.0 14045 夏洛特的文艺 上海
2 母亲节衣服夏季妈妈装夏装套装短袖中年人40-50岁中老年女装T恤 298.0 13458 云新旗舰店 江苏
3 母亲节衣服中老年人春装女40岁50中年妈妈装套装夏装奶奶装两件套 279.0 13340 韶妃旗舰店 浙江
4 中老年女装春夏装裤大码 中年妇女40-50岁妈妈装夏装套装七分裤 59.0 12939 千百奈旗舰店 江苏

列的选择——三种方法选取前2列

df[['宝贝','价格']].head(2)
宝贝 价格
0 新款中老年女装春装雪纺打底衫妈妈装夏装中袖宽松上衣中年人t恤 99.0
1 中老年女装清凉两件套妈妈装夏装大码短袖T恤上衣雪纺衫裙裤套装 286.0
df.loc[:,['宝贝','价格']].head(2)
宝贝 价格
0 新款中老年女装春装雪纺打底衫妈妈装夏装中袖宽松上衣中年人t恤 99.0
1 中老年女装清凉两件套妈妈装夏装大码短袖T恤上衣雪纺衫裙裤套装 286.0
df.iloc[:,:2].head(2)
宝贝 价格
0 新款中老年女装春装雪纺打底衫妈妈装夏装中袖宽松上衣中年人t恤 99.0
1 中老年女装清凉两件套妈妈装夏装大码短袖T恤上衣雪纺衫裙裤套装 286.0
# 用列 把显式的隐式索引找出来,然后用隐式 去处理
df.columns.get_indexer(['宝贝', '价格']) 
array([0, 1], dtype=int64)
df.iloc[1:4,df.columns.get_indexer(['宝贝', '价格'])]
# = df.iloc[1:4,[0,1]]
宝贝 价格
1 中老年女装清凉两件套妈妈装夏装大码短袖T恤上衣雪纺衫裙裤套装 286.0
2 母亲节衣服夏季妈妈装夏装套装短袖中年人40-50岁中老年女装T恤 298.0
3 母亲节衣服中老年人春装女40岁50中年妈妈装套装夏装奶奶装两件套 279.0
df.iloc[:, df.columns.get_indexer(['宝贝', '价格'])].head(2)
# 适用于列非常多的数据集
宝贝 价格
0 新款中老年女装春装雪纺打底衫妈妈装夏装中袖宽松上衣中年人t恤 99.0
1 中老年女装清凉两件套妈妈装夏装大码短袖T恤上衣雪纺衫裙裤套装 286.0

区域块的选择——三种方法选择前3行,前2列

df.iloc[:3,:2]  
# 选择前3行,前2列
宝贝 价格
0 新款中老年女装春装雪纺打底衫妈妈装夏装中袖宽松上衣中年人t恤 99.0
1 中老年女装清凉两件套妈妈装夏装大码短袖T恤上衣雪纺衫裙裤套装 286.0
2 母亲节衣服夏季妈妈装夏装套装短袖中年人40-50岁中老年女装T恤 298.0
df.loc[0:2,['宝贝','价格']]
# 0:2表示行的标签
宝贝 价格
0 新款中老年女装春装雪纺打底衫妈妈装夏装中袖宽松上衣中年人t恤 99.0
1 中老年女装清凉两件套妈妈装夏装大码短袖T恤上衣雪纺衫裙裤套装 286.0
2 母亲节衣服夏季妈妈装夏装套装短袖中年人40-50岁中老年女装T恤 298.0
df.index[0:3]
RangeIndex(start=0, stop=3, step=1)
df.columns[:2]
Index(['宝贝', '价格'], dtype='object')
df.loc[df.index[0:3],df.columns[:2]]
# df.index[0:3]
# 实际返回的0,1,2
宝贝 价格
0 新款中老年女装春装雪纺打底衫妈妈装夏装中袖宽松上衣中年人t恤 99.0
1 中老年女装清凉两件套妈妈装夏装大码短袖T恤上衣雪纺衫裙裤套装 286.0
2 母亲节衣服夏季妈妈装夏装套装短袖中年人40-50岁中老年女装T恤 298.0
# 小练习:用iloc方法选择70——74行,价格和卖家这两列
df.columns
Index(['宝贝', '价格', '成交量', '卖家', '位置'], dtype='object')
df.iloc[70:75,[1,3]]
价格 卖家
70 320.0 朵莹旗舰店
71 318.0 晨旭服饰678
72 177.0 步古旗舰店
73 288.0 妈妈装工厂店1988
74 218.0 第二号鞋铺
df.iloc[70:75,[1,3]]
价格 卖家
70 320.0 朵莹旗舰店
71 318.0 晨旭服饰678
72 177.0 步古旗舰店
73 288.0 妈妈装工厂店1988
74 218.0 第二号鞋铺
df.columns.get_indexer(['价格', '卖家'])
array([1, 3], dtype=int64)
df.iloc[70:75,df.columns.get_indexer(['价格', '卖家'])]
价格 卖家
70 320.0 朵莹旗舰店
71 318.0 晨旭服饰678
72 177.0 步古旗舰店
73 288.0 妈妈装工厂店1988
74 218.0 第二号鞋铺

数据的整理

  • 增加一列销售额
  • 过滤掉价格>=100,成交量<8000的商品信息
df.head(2)
宝贝 价格 成交量 卖家 位置
0 新款中老年女装春装雪纺打底衫妈妈装夏装中袖宽松上衣中年人t恤 99.0 16647 夏奈凤凰旗舰店 江苏
1 中老年女装清凉两件套妈妈装夏装大码短袖T恤上衣雪纺衫裙裤套装 286.0 14045 夏洛特的文艺 上海
df['销售额'] = df['价格'] * df['成交量']
df.head(2)
宝贝 价格 成交量 卖家 位置 销售额
0 新款中老年女装春装雪纺打底衫妈妈装夏装中袖宽松上衣中年人t恤 99.0 16647 夏奈凤凰旗舰店 江苏 1648053.0
1 中老年女装清凉两件套妈妈装夏装大码短袖T恤上衣雪纺衫裙裤套装 286.0 14045 夏洛特的文艺 上海 4016870.0
  • 增加分析的条件,过滤掉价格>=100,成交量<8000的商品信息
df['成交量'] >=8000
0      True
1      True
2      True
3      True
4      True
      ...  
95    False
96    False
97    False
98    False
99    False
Name: 成交量, Length: 100, dtype: bool
df['价格']<100
0      True
1     False
2     False
3     False
4      True
      ...  
95    False
96    False
97    False
98    False
99    False
Name: 价格, Length: 100, dtype: bool
#和关系的集合逻辑
df[(df['价格']<100) & (df['成交量']>=8000)]
宝贝 价格 成交量 卖家 位置 销售额
0 新款中老年女装春装雪纺打底衫妈妈装夏装中袖宽松上衣中年人t恤 99.0 16647 夏奈凤凰旗舰店 江苏 1648053.0
4 中老年女装春夏装裤大码 中年妇女40-50岁妈妈装夏装套装七分裤 59.0 12939 千百奈旗舰店 江苏 763401.0
df.index[(df['价格']<100) & (df['成交量']>=8000)]
Int64Index([0, 4], dtype='int64')
df.iloc[df.index[(df.价格<100) & (df.成交量>=8000)],:]
宝贝 价格 成交量 卖家 位置 销售额
0 新款中老年女装春装雪纺打底衫妈妈装夏装中袖宽松上衣中年人t恤 99.0 16647 夏奈凤凰旗舰店 江苏 1648053.0
4 中老年女装春夏装裤大码 中年妇女40-50岁妈妈装夏装套装七分裤 59.0 12939 千百奈旗舰店 江苏 763401.0
df.loc[(df.价格<100) & (df.成交量>=8000),:]
宝贝 价格 成交量 卖家 位置 销售额
0 新款中老年女装春装雪纺打底衫妈妈装夏装中袖宽松上衣中年人t恤 99.0 16647 夏奈凤凰旗舰店 江苏 1648053.0
4 中老年女装春夏装裤大码 中年妇女40-50岁妈妈装夏装套装七分裤 59.0 12939 千百奈旗舰店 江苏 763401.0
df[~(df.价格>=100) & ~(df.成交量<8000)]
宝贝 价格 成交量 卖家 位置 销售额
0 新款中老年女装春装雪纺打底衫妈妈装夏装中袖宽松上衣中年人t恤 99.0 16647 夏奈凤凰旗舰店 江苏 1648053.0
4 中老年女装春夏装裤大码 中年妇女40-50岁妈妈装夏装套装七分裤 59.0 12939 千百奈旗舰店 江苏 763401.0

and/or 只能针对左右只有一个布尔值来进行运算
&/| 可以针对左右多个布尔值进行一一比较

# 将位置设置为索引
df1=df.set_index('位置')
df1.head(2)
宝贝 价格 成交量 卖家 销售额
位置
江苏 新款中老年女装春装雪纺打底衫妈妈装夏装中袖宽松上衣中年人t恤 99.0 16647 夏奈凤凰旗舰店 1648053.0
上海 中老年女装清凉两件套妈妈装夏装大码短袖T恤上衣雪纺衫裙裤套装 286.0 14045 夏洛特的文艺 4016870.0
df2=df1.sort_index()# 分组并降序排序
df2.head(2)
宝贝 价格 成交量 卖家 销售额
位置
上海 中老年女装夏装套装加肥加大码T恤上衣妈妈装时尚短袖夏季两件套 298.0 5325 简港旗舰店 1586850.0
上海 中老年女装清凉两件套妈妈装夏装大码短袖T恤上衣雪纺衫裙裤套装 286.0 14045 夏洛特的文艺 4016870.0
df3=df.set_index(['位置','卖家'])
# 设置‘位置’与‘卖家’为索引
# 并根据位置进行排序
df3.head()
宝贝 价格 成交量 销售额
位置 卖家
江苏 夏奈凤凰旗舰店 新款中老年女装春装雪纺打底衫妈妈装夏装中袖宽松上衣中年人t恤 99.0 16647 1648053.0
上海 夏洛特的文艺 中老年女装清凉两件套妈妈装夏装大码短袖T恤上衣雪纺衫裙裤套装 286.0 14045 4016870.0
江苏 云新旗舰店 母亲节衣服夏季妈妈装夏装套装短袖中年人40-50岁中老年女装T恤 298.0 13458 4010484.0
浙江 韶妃旗舰店 母亲节衣服中老年人春装女40岁50中年妈妈装套装夏装奶奶装两件套 279.0 13340 3721860.0
江苏 千百奈旗舰店 中老年女装春夏装裤大码 中年妇女40-50岁妈妈装夏装套装七分裤 59.0 12939 763401.0
df3.sort_index(level=0).head(2)
宝贝 价格 成交量 销售额
位置 卖家
上海 xudong158 中老年女装夏装短袖t恤衫中年妇女母亲节衣服妈妈装雪纺套装上衣 99.0 4572 452628.0
佳福妈妈商城 中老年人女装套装妈妈装夏装大码奶奶装40-50岁60短袖T恤70两件套 29.0 4752 137808.0
#删除宝贝和卖家这两列
#方法一
new_df=df.copy()
new_df.head()
宝贝 价格 成交量 卖家 位置 销售额
0 新款中老年女装春装雪纺打底衫妈妈装夏装中袖宽松上衣中年人t恤 99.0 16647 夏奈凤凰旗舰店 江苏 1648053.0
1 中老年女装清凉两件套妈妈装夏装大码短袖T恤上衣雪纺衫裙裤套装 286.0 14045 夏洛特的文艺 上海 4016870.0
2 母亲节衣服夏季妈妈装夏装套装短袖中年人40-50岁中老年女装T恤 298.0 13458 云新旗舰店 江苏 4010484.0
3 母亲节衣服中老年人春装女40岁50中年妈妈装套装夏装奶奶装两件套 279.0 13340 韶妃旗舰店 浙江 3721860.0
4 中老年女装春夏装裤大码 中年妇女40-50岁妈妈装夏装套装七分裤 59.0 12939 千百奈旗舰店 江苏 763401.0
del new_df['宝贝']
del new_df['卖家']
new_df.head()
价格 成交量 位置 销售额
0 99.0 16647 江苏 1648053.0
1 286.0 14045 上海 4016870.0
2 298.0 13458 江苏 4010484.0
3 279.0 13340 浙江 3721860.0
4 59.0 12939 江苏 763401.0
#方法二
df_deal=df.drop(['宝贝','卖家'],axis=1)
df_deal.head()
价格 成交量 位置 销售额
0 99.0 16647 江苏 1648053.0
1 286.0 14045 上海 4016870.0
2 298.0 13458 江苏 4010484.0
3 279.0 13340 浙江 3721860.0
4 59.0 12939 江苏 763401.0

4、数据的分组

df.head()
宝贝 价格 成交量 卖家 位置 销售额
0 新款中老年女装春装雪纺打底衫妈妈装夏装中袖宽松上衣中年人t恤 99.0 16647 夏奈凤凰旗舰店 江苏 1648053.0
1 中老年女装清凉两件套妈妈装夏装大码短袖T恤上衣雪纺衫裙裤套装 286.0 14045 夏洛特的文艺 上海 4016870.0
2 母亲节衣服夏季妈妈装夏装套装短袖中年人40-50岁中老年女装T恤 298.0 13458 云新旗舰店 江苏 4010484.0
3 母亲节衣服中老年人春装女40岁50中年妈妈装套装夏装奶奶装两件套 279.0 13340 韶妃旗舰店 浙江 3721860.0
4 中老年女装春夏装裤大码 中年妇女40-50岁妈妈装夏装套装七分裤 59.0 12939 千百奈旗舰店 江苏 763401.0
df['位置'].value_counts()
江苏    44
浙江    28
上海    10
湖北     7
北京     6
河北     3
广东     1
河南     1
Name: 位置, dtype: int64
len(df['位置'].value_counts())
8
# 将所需的字段作为索引,然后使用汇总函数进行汇总计算
#根据位置进行分组,计算成交量的均值
df['成交量'].groupby(df['位置']).mean()
位置
上海    6801.500000
北京    4519.333333
广东    5164.000000
江苏    7030.909091
河北    6050.666667
河南    5986.000000
浙江    5779.500000
湖北    6182.000000
Name: 成交量, dtype: float64
df.groupby(df['位置']).mean()
价格 成交量 销售额
位置
上海 161.200000 6801.500000 1.256211e+06
北京 150.000000 4519.333333 6.846817e+05
广东 326.000000 5164.000000 1.683464e+06
江苏 223.611364 7030.909091 1.551363e+06
河北 152.000000 6050.666667 9.224000e+05
河南 119.000000 5986.000000 7.123340e+05
浙江 290.428571 5779.500000 1.650173e+06
湖北 254.714286 6182.000000 1.536022e+06
# 根据位置进行索引,然后求价格的均值,成交量的总和,销售额的均值
df.groupby(df['位置']).agg({
     '价格':np.mean,'成交量':np.sum,'销售额':np.mean})
# agg是聚合函数 aggregation的缩写
价格 成交量 销售额
位置
上海 161.200000 68015 1.256211e+06
北京 150.000000 27116 6.846817e+05
广东 326.000000 5164 1.683464e+06
江苏 223.611364 309360 1.551363e+06
河北 152.000000 18152 9.224000e+05
河南 119.000000 5986 7.123340e+05
浙江 290.428571 161826 1.650173e+06
湖北 254.714286 43274 1.536022e+06
# 按多组列进行分组汇总
df.groupby([df['位置'],df['卖家']]).mean()
# 默认将分组的列作为索引
价格 成交量 销售额
位置 卖家
上海 xudong158 99.0 4572.0 452628.0
佳福妈妈商城 29.0 4752.0 137808.0
夏洛特的文艺 286.0 14045.0 4016870.0
妃莲慕旗舰店 133.0 5377.5 718505.0
婆家娘家商城 198.0 5304.0 1050192.0
... ... ... ... ...
湖北 凯利娜格旗舰店 178.0 4111.0 731758.0
千百萌旗舰店 199.0 12398.0 2467202.0
千香旗舰店 158.0 5001.0 790158.0
欧芮嘉旗舰店 368.0 4041.0 1487088.0
薇诗琪旗舰店 318.0 8580.0 2728440.0

85 rows × 3 columns

# 直接使用列名进行分组
df.groupby('位置').mean()
# 将指定的字段作为索引,对所有的数值型字段进行汇总计算
价格 成交量 销售额
位置
上海 161.200000 6801.500000 1.256211e+06
北京 150.000000 4519.333333 6.846817e+05
广东 326.000000 5164.000000 1.683464e+06
江苏 223.611364 7030.909091 1.551363e+06
河北 152.000000 6050.666667 9.224000e+05
河南 119.000000 5986.000000 7.123340e+05
浙江 290.428571 5779.500000 1.650173e+06
湖北 254.714286 6182.000000 1.536022e+06
df.groupby(['位置','卖家']).mean()
价格 成交量 销售额
位置 卖家
上海 xudong158 99.0 4572.0 452628.0
佳福妈妈商城 29.0 4752.0 137808.0
夏洛特的文艺 286.0 14045.0 4016870.0
妃莲慕旗舰店 133.0 5377.5 718505.0
婆家娘家商城 198.0 5304.0 1050192.0
... ... ... ... ...
湖北 凯利娜格旗舰店 178.0 4111.0 731758.0
千百萌旗舰店 199.0 12398.0 2467202.0
千香旗舰店 158.0 5001.0 790158.0
欧芮嘉旗舰店 368.0 4041.0 1487088.0
薇诗琪旗舰店 318.0 8580.0 2728440.0

85 rows × 3 columns

df.groupby('位置').size()   # 返回分组个数大小
位置
上海    10
北京     6
广东     1
江苏    44
河北     3
河南     1
浙江    28
湖北     7
dtype: int64
df.groupby(['位置','卖家']).size()
位置  卖家       
上海  xudong158    1
    佳福妈妈商城       1
    夏洛特的文艺       1
    妃莲慕旗舰店       2
    婆家娘家商城       1
                ..
湖北  凯利娜格旗舰店      1
    千百萌旗舰店       1
    千香旗舰店        1
    欧芮嘉旗舰店       1
    薇诗琪旗舰店       1
Length: 85, dtype: int64

5、数据的分割与合并

  • concat()函数
  • merge()函数
df.head(3)
宝贝 价格 成交量 卖家 位置 销售额
0 新款中老年女装春装雪纺打底衫妈妈装夏装中袖宽松上衣中年人t恤 99.0 16647 夏奈凤凰旗舰店 江苏 1648053.0
1 中老年女装清凉两件套妈妈装夏装大码短袖T恤上衣雪纺衫裙裤套装 286.0 14045 夏洛特的文艺 上海 4016870.0
2 母亲节衣服夏季妈妈装夏装套装短袖中年人40-50岁中老年女装T恤 298.0 13458 云新旗舰店 江苏 4010484.0
#把行索引为20-29,列名为位置和卖家的数据切出来
#方法一:
df1 = df.loc[20:29,['位置','卖家']]
df1
位置 卖家
20 江苏 纳笛佳女装旗舰店
21 上海 简港旗舰店
22 浙江 潮流前线9170
23 浙江 胖织缘福旗舰店
24 浙江 卧雪旗舰店
25 江苏 衣之绒旗舰店
26 江苏 康乃馨老年装
27 江苏 妈咪衣橱纺
28 江苏 爱莱嘉旗舰店
29 江苏 高康洁
#方法二
df1=df[20:30][['位置','卖家']]
df1
位置 卖家
20 江苏 纳笛佳女装旗舰店
21 上海 简港旗舰店
22 浙江 潮流前线9170
23 浙江 胖织缘福旗舰店
24 浙江 卧雪旗舰店
25 江苏 衣之绒旗舰店
26 江苏 康乃馨老年装
27 江苏 妈咪衣橱纺
28 江苏 爱莱嘉旗舰店
29 江苏 高康洁
#把行索引为25-35,列索引为卖家、价格、成交量提取出来
#方法一
df2 = df[25:36][['卖家','价格','成交量']]
df2
卖家 价格 成交量
25 衣之绒旗舰店 399.0 7046
26 康乃馨老年装 128.0 7002
27 妈咪衣橱纺 396.0 6929
28 爱莱嘉旗舰店 49.0 6816
29 高康洁 108.0 6795
30 蒲洛妃旗舰店 108.0 6755
31 悦薇孔雀旗舰店 298.0 6270
32 摩尼树旗舰店 198.0 6262
33 梵忆轩旗舰店 148.0 6224
34 loueddssd倍艾旗舰店 198.0 6168
35 蒲洛妃旗舰店 258.0 6085
#方法二
df2 = df.loc[25:35,['卖家','价格','成交量']]
df2
卖家 价格 成交量
25 衣之绒旗舰店 399.0 7046
26 康乃馨老年装 128.0 7002
27 妈咪衣橱纺 396.0 6929
28 爱莱嘉旗舰店 49.0 6816
29 高康洁 108.0 6795
30 蒲洛妃旗舰店 108.0 6755
31 悦薇孔雀旗舰店 298.0 6270
32 摩尼树旗舰店 198.0 6262
33 梵忆轩旗舰店 148.0 6224
34 loueddssd倍艾旗舰店 198.0 6168
35 蒲洛妃旗舰店 258.0 6085
#方法三
df2 = df.iloc[25:36,[3,1,2]]
df2
卖家 价格 成交量
25 衣之绒旗舰店 399.0 7046
26 康乃馨老年装 128.0 7002
27 妈咪衣橱纺 396.0 6929
28 爱莱嘉旗舰店 49.0 6816
29 高康洁 108.0 6795
30 蒲洛妃旗舰店 108.0 6755
31 悦薇孔雀旗舰店 298.0 6270
32 摩尼树旗舰店 198.0 6262
33 梵忆轩旗舰店 148.0 6224
34 loueddssd倍艾旗舰店 198.0 6168
35 蒲洛妃旗舰店 258.0 6085
# pd.merge()根据一个或多个key值,将dataframe连接(join)
# pd.concat()沿着一个轴将多个对象堆叠起来
# combine_first()如果有缺失值,另外一个数据集根据对齐进行填充
pd.merge(df1,df2)
位置 卖家 价格 成交量
0 江苏 衣之绒旗舰店 399.0 7046
1 江苏 康乃馨老年装 128.0 7002
2 江苏 妈咪衣橱纺 396.0 6929
3 江苏 爱莱嘉旗舰店 49.0 6816
4 江苏 高康洁 108.0 6795
pd.merge(df1,df2,how='right')
位置 卖家 价格 成交量
0 江苏 衣之绒旗舰店 399.0 7046
1 江苏 康乃馨老年装 128.0 7002
2 江苏 妈咪衣橱纺 396.0 6929
3 江苏 爱莱嘉旗舰店 49.0 6816
4 江苏 高康洁 108.0 6795
5 NaN 蒲洛妃旗舰店 108.0 6755
6 NaN 蒲洛妃旗舰店 258.0 6085
7 NaN 悦薇孔雀旗舰店 298.0 6270
8 NaN 摩尼树旗舰店 198.0 6262
9 NaN 梵忆轩旗舰店 148.0 6224
10 NaN loueddssd倍艾旗舰店 198.0 6168
pd.merge(df1,df2,on='卖家')
位置 卖家 价格 成交量
0 江苏 衣之绒旗舰店 399.0 7046
1 江苏 康乃馨老年装 128.0 7002
2 江苏 妈咪衣橱纺 396.0 6929
3 江苏 爱莱嘉旗舰店 49.0 6816
4 江苏 高康洁 108.0 6795
pd.merge(df1,df2,how='inner')
#通常情况下,前一个是左表,后一个是右表
#how默认为inner,还可以使用outer、left、right
位置 卖家 价格 成交量
0 江苏 衣之绒旗舰店 399.0 7046
1 江苏 康乃馨老年装 128.0 7002
2 江苏 妈咪衣橱纺 396.0 6929
3 江苏 爱莱嘉旗舰店 49.0 6816
4 江苏 高康洁 108.0 6795
# 按照索引合并
pd.merge(df1,df2,left_index=True,right_index=True)
位置 卖家_x 卖家_y 价格 成交量
25 江苏 衣之绒旗舰店 衣之绒旗舰店 399.0 7046
26 江苏 康乃馨老年装 康乃馨老年装 128.0 7002
27 江苏 妈咪衣橱纺 妈咪衣橱纺 396.0 6929
28 江苏 爱莱嘉旗舰店 爱莱嘉旗舰店 49.0 6816
29 江苏 高康洁 高康洁 108.0 6795
# concat进行轴方向上的连接
item1=df[:5]['宝贝']
item2=df[5:10]['宝贝']
item3=df[10:15]['宝贝']
item3
10    母亲节衣服夏季中年女装春装套装40-50岁妈妈装外套中老年人上衣
11     母亲节衣服中老年人女装奶奶短袖两件套中年40岁胖妈妈装夏装套装
12    母亲节中老年女装短袖t恤40-50岁中年妈妈装夏装套装上衣两件套
13     母亲节中老年女装短袖t恤40-50岁中年妈妈装夏装雪纺两件套装
14      中老年女装春装真两件套长袖针织开衫外套妈妈装夏装短袖T恤上衣
Name: 宝贝, dtype: object
pd.concat([item1,item2,item3]) # 默认axis=0,按照行连接
0         新款中老年女装春装雪纺打底衫妈妈装夏装中袖宽松上衣中年人t恤
1         中老年女装清凉两件套妈妈装夏装大码短袖T恤上衣雪纺衫裙裤套装
2       母亲节衣服夏季妈妈装夏装套装短袖中年人40-50岁中老年女装T恤
3       母亲节衣服中老年人春装女40岁50中年妈妈装套装夏装奶奶装两件套
4       中老年女装春夏装裤大码 中年妇女40-50岁妈妈装夏装套装七分裤
5     中老年女装夏装短袖T恤40-50岁中年春装30打底衫妈妈装母亲节衣服
6      妈妈装春夏装T恤宽松雪纺衬衫40-50岁中老年女装大码中袖上衣套装
7      中老年女装夏季T恤雪纺衫妈妈装夏装套装短袖中年妇女40-50岁t恤
8       妈妈夏装两件套母亲节衣服老人上衣60-70岁人夏季中老年女装套装
9          中老年女装夏装套装圆领上衣裤子夏季中年妈妈装短袖T恤两件套
10      母亲节衣服夏季中年女装春装套装40-50岁妈妈装外套中老年人上衣
11       母亲节衣服中老年人女装奶奶短袖两件套中年40岁胖妈妈装夏装套装
12      母亲节中老年女装短袖t恤40-50岁中年妈妈装夏装套装上衣两件套
13       母亲节中老年女装短袖t恤40-50岁中年妈妈装夏装雪纺两件套装
14        中老年女装春装真两件套长袖针织开衫外套妈妈装夏装短袖T恤上衣
Name: 宝贝, dtype: object
cols_1=df[:6]['宝贝']
cols_2=df[:6]['价格']
cols_3=df[:6]['成交量']
pd.concat([cols_1,cols_2,cols_3],axis=1) # axis=1,按照列连接
宝贝 价格 成交量
0 新款中老年女装春装雪纺打底衫妈妈装夏装中袖宽松上衣中年人t恤 99.0 16647
1 中老年女装清凉两件套妈妈装夏装大码短袖T恤上衣雪纺衫裙裤套装 286.0 14045
2 母亲节衣服夏季妈妈装夏装套装短袖中年人40-50岁中老年女装T恤 298.0 13458
3 母亲节衣服中老年人春装女40岁50中年妈妈装套装夏装奶奶装两件套 279.0 13340
4 中老年女装春夏装裤大码 中年妇女40-50岁妈妈装夏装套装七分裤 59.0 12939
5 中老年女装夏装短袖T恤40-50岁中年春装30打底衫妈妈装母亲节衣服 198.0 12664
cols_1=df[:6][['宝贝','位置']]
cols_2=df[:6][['价格','成交量']]
cols_2
价格 成交量
0 99.0 16647
1 286.0 14045
2 298.0 13458
3 279.0 13340
4 59.0 12939
5 198.0 12664
pd.concat([cols_1,cols_2],axis=1)
宝贝 位置 价格 成交量
0 新款中老年女装春装雪纺打底衫妈妈装夏装中袖宽松上衣中年人t恤 江苏 99.0 16647
1 中老年女装清凉两件套妈妈装夏装大码短袖T恤上衣雪纺衫裙裤套装 上海 286.0 14045
2 母亲节衣服夏季妈妈装夏装套装短袖中年人40-50岁中老年女装T恤 江苏 298.0 13458
3 母亲节衣服中老年人春装女40岁50中年妈妈装套装夏装奶奶装两件套 浙江 279.0 13340
4 中老年女装春夏装裤大码 中年妇女40-50岁妈妈装夏装套装七分裤 江苏 59.0 12939
5 中老年女装夏装短袖T恤40-50岁中年春装30打底衫妈妈装母亲节衣服 江苏 198.0 12664

6、数据的重塑与透视

6.1 数据的重塑

data = pd.read_csv('data/1.data清洗/hz_weather.csv')
data.head(2)
日期 最高气温 最低气温 天气 风向 风力
0 2017-01-01 17 7 西北风 2级
1 2017-01-02 16 8 多云 东北风 2级
data.shape
(118, 6)
data.stack() 
# 列转为行
# 结果为结构层次化索引的series
0    日期      2017-01-01
     最高气温            17
     最低气温             7
     天气               晴
     风向             西北风
                ...    
117  最高气温            29
     最低气温            16
     天气              多云
     风向              东风
     风力              2级
Length: 708, dtype: object
data.unstack()
日期  0      2017-01-01
    1      2017-01-02
    2      2017-01-03
    3      2017-01-04
    4      2017-01-05
              ...    
风力  113            5级
    114            2级
    115            2级
    116            3级
    117            2级
Length: 708, dtype: object
data.stack().unstack().head()
日期 最高气温 最低气温 天气 风向 风力
0 2017-01-01 17 7 西北风 2级
1 2017-01-02 16 8 多云 东北风 2级
2 2017-01-03 15 8 多云 东北风 1级
3 2017-01-04 15 11 小雨 西北风 2级
4 2017-01-05 13 11 小到中雨 北风 2级

6.2 数据的透视

df = data.set_index('日期')
df.head(3)
最高气温 最低气温 天气 风向 风力
日期
2017-01-01 17 7 西北风 2级
2017-01-02 16 8 多云 东北风 2级
2017-01-03 15 8 多云 东北风 1级
#建立一个透视表:值是最高气温的平均值,天气为行索引,风力为列索引

df1 = pd.pivot_table(df                     
                     ,values=['最高气温']
                     ,index=['天气']
                     ,columns=['风力']
                     ,aggfunc='max'         # 设置值的计算方式
                     # ill_value='missing'  # 填充透视表中缺失值的方式,默认 NaN
                     ,margins=True         # 统计每行每列的情况
                     ,dropna=True          # 删除透视表中全部都为空值的列
                     ,margins_name='总计'  # 改变统计行和列的名称
                    )

df1
最高气温
风力 1级 2级 3级 4级 5级 6级 微风 总计
天气
中雨 NaN 11.0 11.0 27.0 NaN NaN NaN 27
多云 17.0 29.0 31.0 26.0 16.0 25.0 NaN 31
小到中雨 NaN 13.0 NaN NaN NaN NaN NaN 13
小雨 14.0 19.0 15.0 19.0 NaN NaN 13.0 19
18.0 26.0 29.0 27.0 NaN 19.0 15.0 29
16.0 18.0 14.0 26.0 NaN NaN NaN 26
阵雨 NaN 21.0 26.0 30.0 19.0 NaN NaN 30
雨夹雪 NaN NaN NaN 7.0 NaN NaN NaN 7
总计 18.0 29.0 31.0 30.0 19.0 25.0 15.0 31


练习:行索引是风向,列索引是风力,值是最低气温的最小值,建一个透视表


df2 = pd.pivot_table(df                     
                     ,values=['最低气温']
                     ,index=['风向']
                     ,columns=['风力']
                     ,aggfunc='min'         # 设置值的计算方式
                     # ill_value='missing'  # 填充透视表中缺失值的方式,默认 NaN
                     ,margins=True         # 统计每行每列的情况
                     ,dropna=True          # 删除透视表中全部都为空值的列
                     ,margins_name='总计'  # 改变统计行和列的名称
                    )

df2
最低气温
风力 1级 2级 3级 4级 5级 6级 微风 总计
风向
东北风 2.0 -2.0 -3.0 6.0 NaN NaN NaN -3
东南风 0.0 -1.0 12.0 NaN NaN NaN NaN -1
东风 0.0 2.0 2.0 11.0 NaN NaN NaN 0
北风 -1.0 3.0 -1.0 -1.0 7.0 16.0 3.0 -1
南风 2.0 3.0 16.0 15.0 NaN NaN NaN 2
西北风 NaN 7.0 NaN NaN NaN 6.0 NaN 6
西南风 4.0 9.0 7.0 21.0 NaN NaN NaN 4
总计 -1.0 -2.0 -3.0 -1.0 7.0 6.0 3.0 -3

7.数据的分组、分割与合并、重塑

  • 1.按照出发地和目的地,生成旅游路线的平均价格汇总表
  • 2.汇总一个大表,包含出发地——目的地,路线总数以及平均价格
  • 3.查看出发地目的地的平均价格的透视分析
  • 4.从杭州出发—目的地-去程方式-平均价格的数据透视表
df_free=pd.read_csv('data/1.data清洗/qunar_free_trip.csv')
df_free.head(2)
出发地 目的地 价格 节省 路线名 酒店 房间 去程航司 去程方式 去程时间 回程航司 回程方式 回程时间
0 北京 厦门 1866 492 北京-厦门3天2晚 | 入住厦门温特雅酒店 + 联合航空/首都航空往返机票 厦门温特雅酒店 舒适型 3.9分/5分 标准房(大床)(预付) 大床 不含早 1间2晚 联合航空 KN5927 直飞 16:55-19:45 首都航空 JD5376 直飞 22:15-01:15
1 北京 厦门 2030 492 北京-厦门3天2晚 | 入住厦门华美达长升大酒店 + 联合航空/首都航空往返机票 厦门华美达长升大酒店 4.1分/5分 标准房(错峰出游) 大/双床 双早 1间2晚 联合航空 KN5927 直飞 16:55-19:45 首都航空 JD5376 直飞 22:15-01:15
df_free.shape
(30821, 13)
df_all=pd.read_csv('data/1.data清洗/qunar_route_cnt.csv',encoding='utf-8')
df_all.head(2)
出发地 目的地 路线总数
0 北京 厦门 359
1 北京 青岛 471
df_all.shape
(247, 3)

1. 按照出发地和目的地,生成旅游路线的平均价格汇总表

df_free.head(2)
出发地 目的地 价格 节省 路线名 酒店 房间 去程航司 去程方式 去程时间 回程航司 回程方式 回程时间
0 北京 厦门 1866 492 北京-厦门3天2晚 | 入住厦门温特雅酒店 + 联合航空/首都航空往返机票 厦门温特雅酒店 舒适型 3.9分/5分 标准房(大床)(预付) 大床 不含早 1间2晚 联合航空 KN5927 直飞 16:55-19:45 首都航空 JD5376 直飞 22:15-01:15
1 北京 厦门 2030 492 北京-厦门3天2晚 | 入住厦门华美达长升大酒店 + 联合航空/首都航空往返机票 厦门华美达长升大酒店 4.1分/5分 标准房(错峰出游) 大/双床 双早 1间2晚 联合航空 KN5927 直飞 16:55-19:45 首都航空 JD5376 直飞 22:15-01:15
df_free.info()

RangeIndex: 30821 entries, 0 to 30820
Data columns (total 13 columns):
 #   Column  Non-Null Count  Dtype 
---  ------  --------------  ----- 
 0   出发地     30821 non-null  object
 1   目的地     30821 non-null  object
 2   价格      30821 non-null  int64 
 3   节省      30821 non-null  int64 
 4   路线名     30821 non-null  object
 5   酒店      30821 non-null  object
 6   房间      30821 non-null  object
 7   去程航司    30821 non-null  object
 8   去程方式    30821 non-null  object
 9   去程时间    30821 non-null  object
 10  回程航司    30821 non-null  object
 11  回程方式    30821 non-null  object
 12  回程时间    30821 non-null  object
dtypes: int64(2), object(11)
memory usage: 3.1+ MB
df_free.groupby(['出发地','目的地'],as_index=False).mean().head(3)
出发地 目的地 价格 节省
0 上海 三亚 1627.35 444.39
1 上海 丽江 1981.49 569.38
2 上海 乌鲁木齐 3223.76 711.80
# 删除节省这一列
df1 = df_free.groupby(['出发地','目的地'],as_index=False).mean()
# del df1['节省']
df1.drop('节省',axis=1,inplace=True)
df1.head()
出发地 目的地 价格
0 上海 三亚 1627.3500
1 上海 丽江 1981.4900
2 上海 乌鲁木齐 3223.7600
3 上海 九寨沟 1893.7125
4 上海 北京 1317.0900
df_free.groupby(['出发地','目的地'],as_index=False).agg({
     '价格':np.mean}).head(3)
出发地 目的地 价格
0 上海 三亚 1627.35
1 上海 丽江 1981.49
2 上海 乌鲁木齐 3223.76
df_free.groupby(['出发地','目的地'],as_index=False)['价格'].mean().head(3)
出发地 目的地 价格
0 上海 三亚 1627.35
1 上海 丽江 1981.49
2 上海 乌鲁木齐 3223.76

2. 汇总一个大表,包含出发地—目的地,路线总数以及平均价格

df_free.head(2)
出发地 目的地 价格 节省 路线名 酒店 房间 去程航司 去程方式 去程时间 回程航司 回程方式 回程时间
0 北京 厦门 1866 492 北京-厦门3天2晚 | 入住厦门温特雅酒店 + 联合航空/首都航空往返机票 厦门温特雅酒店 舒适型 3.9分/5分 标准房(大床)(预付) 大床 不含早 1间2晚 联合航空 KN5927 直飞 16:55-19:45 首都航空 JD5376 直飞 22:15-01:15
1 北京 厦门 2030 492 北京-厦门3天2晚 | 入住厦门华美达长升大酒店 + 联合航空/首都航空往返机票 厦门华美达长升大酒店 4.1分/5分 标准房(错峰出游) 大/双床 双早 1间2晚 联合航空 KN5927 直飞 16:55-19:45 首都航空 JD5376 直飞 22:15-01:15
new_df=df_free.groupby(['出发地','目的地'],as_index=False).mean()
new_df.head()
出发地 目的地 价格 节省
0 上海 三亚 1627.3500 444.390
1 上海 丽江 1981.4900 569.380
2 上海 乌鲁木齐 3223.7600 711.800
3 上海 九寨沟 1893.7125 492.425
4 上海 北京 1317.0900 344.650
del new_df['节省']
new_df.head(3)
出发地 目的地 价格
0 上海 三亚 1627.35
1 上海 丽江 1981.49
2 上海 乌鲁木齐 3223.76
new_df.shape
(313, 3)
df2 = new_df.set_index(['出发地','目的地'])
df2.head(3)
价格
出发地 目的地
上海 三亚 1627.35
丽江 1981.49
乌鲁木齐 3223.76
df_free.groupby(['出发地','目的地']).agg({
     '价格':np.mean}) 
# 这一行代码即为上述所有df2生成代码的总和
价格
出发地 目的地
上海 三亚 1627.3500
丽江 1981.4900
乌鲁木齐 3223.7600
九寨沟 1893.7125
北京 1317.0900
... ... ...
青岛 海口 1718.7900
深圳 1738.4800
西安 1185.9400
重庆 1547.2900
长沙 1804.0100

313 rows × 1 columns

df_all.head()
出发地 目的地 路线总数
0 北京 厦门 359
1 北京 青岛 471
2 北京 杭州 1228
3 北京 丽江 1160
4 北京 九寨沟 168
df3 = df_all.set_index(['出发地','目的地'])
df3
路线总数
出发地 目的地
北京 厦门 359
青岛 471
杭州 1228
丽江 1160
九寨沟 168
... ... ...
厦门 北京 1444
成都 丽江 1160
西安 876
武汉 厦门 352
杭州 1234

247 rows × 1 columns

df4 = pd.concat([df2,df3],axis=1,sort=True)
df4.head()
价格 路线总数
出发地 目的地
上海 三亚 1627.3500 397
丽江 1981.4900 1159
乌鲁木齐 3223.7600 136
九寨沟 1893.7125 168
北京 1317.0900 1444
df4.head()
价格 路线总数
出发地 目的地
上海 三亚 1627.3500 397
丽江 1981.4900 1159
乌鲁木齐 3223.7600 136
九寨沟 1893.7125 168
北京 1317.0900 1444
df4.shape
(313, 2)
# 删除缺失值
df4_ = df4.dropna()
df4_.shape
(247, 2)

用merge方法进行合并

new_df.head(3)
出发地 目的地 价格
0 上海 三亚 1627.35
1 上海 丽江 1981.49
2 上海 乌鲁木齐 3223.76
df_all.head()
出发地 目的地 路线总数
0 北京 厦门 359
1 北京 青岛 471
2 北京 杭州 1228
3 北京 丽江 1160
4 北京 九寨沟 168
df5 = pd.merge(new_df,df_all)
df5.head()
出发地 目的地 价格 路线总数
0 上海 三亚 1627.3500 397
1 上海 丽江 1981.4900 1159
2 上海 乌鲁木齐 3223.7600 136
3 上海 九寨沟 1893.7125 168
4 上海 北京 1317.0900 1444
df5.shape
(247, 4)

3. 查看出发地目的地的平均价格的透视分析

df_free.head(2)
出发地 目的地 价格 节省 路线名 酒店 房间 去程航司 去程方式 去程时间 回程航司 回程方式 回程时间
0 北京 厦门 1866 492 北京-厦门3天2晚 | 入住厦门温特雅酒店 + 联合航空/首都航空往返机票 厦门温特雅酒店 舒适型 3.9分/5分 标准房(大床)(预付) 大床 不含早 1间2晚 联合航空 KN5927 直飞 16:55-19:45 首都航空 JD5376 直飞 22:15-01:15
1 北京 厦门 2030 492 北京-厦门3天2晚 | 入住厦门华美达长升大酒店 + 联合航空/首都航空往返机票 厦门华美达长升大酒店 4.1分/5分 标准房(错峰出游) 大/双床 双早 1间2晚 联合航空 KN5927 直飞 16:55-19:45 首都航空 JD5376 直飞 22:15-01:15
pd.pivot_table(df_free,index=['出发地'],columns=['目的地'],values=['价格']).head(2)
价格
目的地 三亚 三亚湾 上海 丽江 乌鲁木齐 九寨沟 兰州 北京 北海 南京 ... 西安 鄂尔多斯 重庆 银川 长春 长沙 陵水 青岛 黄山 鼓浪屿
出发地
上海 1627.35 NaN NaN 1981.49 3223.76 1893.7125 NaN 1317.09 NaN NaN ... 1381.83 NaN 1641.17 NaN NaN 1147.92 NaN 886.32 1290.33 NaN
北京 2760.40 NaN NaN 1958.16 2362.06 1953.7400 NaN NaN NaN NaN ... 1283.86 NaN NaN 1025.14 NaN 1300.92 NaN 1016.96 NaN NaN

2 rows × 52 columns

4. 从杭州出发-目的地-去程方式-平均价格的数据透视表

dff = df_free[df_free['出发地']=='杭州']
dff.head(3)
出发地 目的地 价格 节省 路线名 酒店 房间 去程航司 去程方式 去程时间 回程航司 回程方式 回程时间
8760 杭州 厦门 1172 326 杭州-厦门3天2晚 | 入住厦门温特雅酒店 + 山东航空往返机票 厦门温特雅酒店 舒适型 3.9分/5分 标准房(大床)(预付) 大床 不含早 1间2晚 山东航空 SC1174 直飞 22:10-23:45 山东航空 SC8837 直飞 06:50-08:20
8761 杭州 厦门 1336 326 杭州-厦门3天2晚 | 入住厦门华美达长升大酒店 + 山东航空往返机票 厦门华美达长升大酒店 4.1分/5分 标准房(错峰出游) 大/双床 双早 1间2晚 山东航空 SC1174 直飞 22:10-23:45 山东航空 SC8837 直飞 06:50-08:20
8762 杭州 厦门 1445 367 杭州-厦门3天2晚 | 入住厦门毕思特酒店 + 山东航空往返机票 厦门毕思特酒店 高档型 4.4分/5分 标准大床房(特惠)[双... 大床 双早 1间2晚 山东航空 SC1174 直飞 22:10-23:45 山东航空 SC8837 直飞 06:50-08:20
dff['出发地'].value_counts()
杭州    2053
Name: 出发地, dtype: int64
dff.shape
(2053, 13)
pd.pivot_table(dff,values=['价格'],
               index=['出发地','目的地'],
               columns=['去程方式'])
价格
去程方式 直飞 经停
出发地 目的地
杭州 三亚 1839.35 NaN
丽江 NaN 2918.320000
九寨沟 NaN 1952.700000
北海 NaN 2910.000000
厦门 1208.38 NaN
呼和浩特 NaN 1557.570000
哈尔滨 NaN 1690.990000
大连 1710.09 NaN
天子山 1682.03 NaN
天津 1506.03 NaN
张家界 1682.03 NaN
成都 NaN 1898.811111
桂林 1438.98 NaN
武汉 1190.16 NaN
沈阳 1948.03 NaN
西双版纳 NaN 1716.310000
西宁 NaN 2851.820000
西安 1242.89 NaN
重庆 1644.17 NaN
长沙 1160.92 NaN
青岛 1049.23 NaN

8. 缺失值、异常值、重复值的处理

data = pd.read_csv('data/1.data清洗/hz_weather.csv')
data.head()
日期 最高气温 最低气温 天气 风向 风力
0 2017-01-01 17 7 西北风 2级
1 2017-01-02 16 8 多云 东北风 2级
2 2017-01-03 15 8 多云 东北风 1级
3 2017-01-04 15 11 小雨 西北风 2级
4 2017-01-05 13 11 小到中雨 北风 2级
data.shape
(118, 6)
data.isnull().sum()
日期      0
最高气温    0
最低气温    0
天气      0
风向      0
风力      0
dtype: int64
# 求缺失值的比例
data.isnull().mean()
日期      0.0
最高气温    0.0
最低气温    0.0
天气      0.0
风向      0.0
风力      0.0
dtype: float64
data2=pd.pivot_table(data,
                     index=['天气'],
                     columns=['风向'],
                     values=['最高气温'])
data2
最高气温
风向 东北风 东南风 东风 北风 南风 西北风 西南风
天气
中雨 11.000000 NaN 18.5 11.000000 NaN NaN NaN
多云 14.111111 13.75 15.0 13.333333 24.333333 21.0 18.666667
小到中雨 NaN NaN NaN 13.000000 NaN NaN NaN
小雨 13.500000 11.00 14.5 9.250000 NaN 14.0 13.000000
10.250000 15.80 18.0 18.000000 19.000000 18.0 27.500000
13.500000 16.00 13.0 15.600000 14.000000 11.0 NaN
阵雨 NaN 21.00 26.0 15.333333 28.000000 12.0 27.500000
雨夹雪 NaN NaN NaN 7.000000 NaN NaN NaN
# 缺失值的比例
data2.isnull().mean()  
# 求缺失值比例的取巧方法
      风向 
最高气温  东北风    0.375
      东南风    0.375
      东风     0.250
      北风     0.000
      南风     0.500
      西北风    0.375
      西南风    0.500
dtype: float64
data2.isnull().sum()/data2.shape[0] 
# 求缺失值比例常规写法
      风向 
最高气温  东北风    0.375
      东南风    0.375
      东风     0.250
      北风     0.000
      南风     0.500
      西北风    0.375
      西南风    0.500
dtype: float64
data2.mean()
      风向 
最高气温  东北风    12.472222
      东南风    15.510000
      东风     17.500000
      北风     12.814583
      南风     21.333333
      西北风    15.200000
      西南风    21.666667
dtype: float64
data2.fillna(data2.mean()) 
# 最常用的方法是用均值填充缺失值
# 每列填充每一列的均值
最高气温
风向 东北风 东南风 东风 北风 南风 西北风 西南风
天气
中雨 11.000000 15.51 18.5 11.000000 21.333333 15.2 21.666667
多云 14.111111 13.75 15.0 13.333333 24.333333 21.0 18.666667
小到中雨 12.472222 15.51 17.5 13.000000 21.333333 15.2 21.666667
小雨 13.500000 11.00 14.5 9.250000 21.333333 14.0 13.000000
10.250000 15.80 18.0 18.000000 19.000000 18.0 27.500000
13.500000 16.00 13.0 15.600000 14.000000 11.0 21.666667
阵雨 12.472222 21.00 26.0 15.333333 28.000000 12.0 27.500000
雨夹雪 12.472222 15.51 17.5 7.000000 21.333333 15.2 21.666667

删除空值
可使用函数df.dropna,并不会改变原始数据

data2.dropna() 
# 默认删除含有缺失值的行
最高气温
风向 东北风 东南风 东风 北风 南风 西北风 西南风
天气
多云 14.111111 13.75 15.0 13.333333 24.333333 21.0 18.666667
10.250000 15.80 18.0 18.000000 19.000000 18.0 27.500000
data2.dropna(axis=1,how='all')
最高气温
风向 东北风 东南风 东风 北风 南风 西北风 西南风
天气
中雨 11.000000 NaN 18.5 11.000000 NaN NaN NaN
多云 14.111111 13.75 15.0 13.333333 24.333333 21.0 18.666667
小到中雨 NaN NaN NaN 13.000000 NaN NaN NaN
小雨 13.500000 11.00 14.5 9.250000 NaN 14.0 13.000000
10.250000 15.80 18.0 18.000000 19.000000 18.0 27.500000
13.500000 16.00 13.0 15.600000 14.000000 11.0 NaN
阵雨 NaN 21.00 26.0 15.333333 28.000000 12.0 27.500000
雨夹雪 NaN NaN NaN 7.000000 NaN NaN NaN

缺失值的填充

# 1、使用字符串来填充
data2.fillna('missing')
最高气温
风向 东北风 东南风 东风 北风 南风 西北风 西南风
天气
中雨 11 missing 18.5 11.000000 missing missing missing
多云 14.1111 13.75 15 13.333333 24.3333 21 18.6667
小到中雨 missing missing missing 13.000000 missing missing missing
小雨 13.5 11 14.5 9.250000 missing 14 13
10.25 15.8 18 18.000000 19 18 27.5
13.5 16 13 15.600000 14 11 missing
阵雨 missing 21 26 15.333333 28 12 27.5
雨夹雪 missing missing missing 7.000000 missing missing missing
# 2、使用前一个数据来代替缺失值
data2.fillna(method='pad',limit=1)
最高气温
风向 东北风 东南风 东风 北风 南风 西北风 西南风
天气
中雨 11.000000 NaN 18.5 11.000000 NaN NaN NaN
多云 14.111111 13.75 15.0 13.333333 24.333333 21.0 18.666667
小到中雨 14.111111 13.75 15.0 13.000000 24.333333 21.0 18.666667
小雨 13.500000 11.00 14.5 9.250000 NaN 14.0 13.000000
10.250000 15.80 18.0 18.000000 19.000000 18.0 27.500000
13.500000 16.00 13.0 15.600000 14.000000 11.0 27.500000
阵雨 13.500000 21.00 26.0 15.333333 28.000000 12.0 27.500000
雨夹雪 NaN 21.00 26.0 7.000000 28.000000 12.0 27.500000
# 使用后一个值来填充bfill
data2.bfill()
最高气温
风向 东北风 东南风 东风 北风 南风 西北风 西南风
天气
中雨 11.000000 13.75 18.5 11.000000 24.333333 21.0 18.666667
多云 14.111111 13.75 15.0 13.333333 24.333333 21.0 18.666667
小到中雨 13.500000 11.00 14.5 13.000000 19.000000 14.0 13.000000
小雨 13.500000 11.00 14.5 9.250000 19.000000 14.0 13.000000
10.250000 15.80 18.0 18.000000 19.000000 18.0 27.500000
13.500000 16.00 13.0 15.600000 14.000000 11.0 27.500000
阵雨 NaN 21.00 26.0 15.333333 28.000000 12.0 27.500000
雨夹雪 NaN NaN NaN 7.000000 NaN NaN NaN
# 均值填充
data2.fillna(data2.mean())  #最常用
最高气温
风向 东北风 东南风 东风 北风 南风 西北风 西南风
天气
中雨 11.000000 15.51 18.5 11.000000 21.333333 15.2 21.666667
多云 14.111111 13.75 15.0 13.333333 24.333333 21.0 18.666667
小到中雨 12.472222 15.51 17.5 13.000000 21.333333 15.2 21.666667
小雨 13.500000 11.00 14.5 9.250000 21.333333 14.0 13.000000
10.250000 15.80 18.0 18.000000 19.000000 18.0 27.500000
13.500000 16.00 13.0 15.600000 14.000000 11.0 21.666667
阵雨 12.472222 21.00 26.0 15.333333 28.000000 12.0 27.500000
雨夹雪 12.472222 15.51 17.5 7.000000 21.333333 15.2 21.666667

异常值的处理

# 定义x>3标准差或<-3标准差
data = pd.read_csv('data/1.data清洗/hz_weather.csv')
data
日期 最高气温 最低气温 天气 风向 风力
0 2017-01-01 17 7 西北风 2级
1 2017-01-02 16 8 多云 东北风 2级
2 2017-01-03 15 8 多云 东北风 1级
3 2017-01-04 15 11 小雨 西北风 2级
4 2017-01-05 13 11 小到中雨 北风 2级
... ... ... ... ... ... ...
113 2017-04-26 19 13 阵雨 北风 5级
114 2017-04-27 21 11 多云 西北风 2级
115 2017-04-28 26 13 西南风 2级
116 2017-04-29 29 15 西南风 3级
117 2017-04-30 29 16 多云 东风 2级

118 rows × 6 columns

low = data['最高气温'].mean()-3*data['最高气温'].std()
high = data['最高气温'].mean()+3*data['最高气温'].std()

(data['最高气温'] > high) | (data['最高气温'] < low) 
data[(data['最高气温'] > high) | (data['最高气温'] < low) ]
日期 最高气温 最低气温 天气 风向 风力
def func(data,column):
    high = data[column].mean() + 3 * data[column].std()
    low = data[column].mean() - 3* data[column].std()
    res_df = data[(data[column] > high) | (data[column]< low)]
    return res_df
func(data,'最低气温')
日期 最高气温 最低气温 天气 风向 风力
data.head()
日期 最高气温 最低气温 天气 风向 风力
0 2017-01-01 17 7 西北风 2级
1 2017-01-02 16 8 多云 东北风 2级
2 2017-01-03 15 8 多云 东北风 1级
3 2017-01-04 15 11 小雨 西北风 2级
4 2017-01-05 13 11 小到中雨 北风 2级
data.info()

RangeIndex: 118 entries, 0 to 117
Data columns (total 6 columns):
 #   Column  Non-Null Count  Dtype 
---  ------  --------------  ----- 
 0   日期      118 non-null    object
 1   最高气温    118 non-null    int64 
 2   最低气温    118 non-null    int64 
 3   天气      118 non-null    object
 4   风向      118 non-null    object
 5   风力      118 non-null    object
dtypes: int64(2), object(4)
memory usage: 5.7+ KB
data['最高气温'].std()
6.3899548141154945
data['最高气温'].mean()
15.542372881355933
l = data['最高气温'].mean()-2*data['最高气温'].std()
h = data['最高气温'].mean()+2*data['最高气温'].std()
((data['最高气温']<l)|(data['最高气温']>h)).sum()
5
h = data['最高气温'].mean()+2*data['最高气温'].std()
# 在原数据集中增加一列‘异常值’(超过2倍标准差算异常值)
data['异常值'] = (data['最高气温']<l) | (data['最高气温']>h)
data.head()
日期 最高气温 最低气温 天气 风向 风力 异常值
0 2017-01-01 17 7 西北风 2级 False
1 2017-01-02 16 8 多云 东北风 2级 False
2 2017-01-03 15 8 多云 东北风 1级 False
3 2017-01-04 15 11 小雨 西北风 2级 False
4 2017-01-05 13 11 小到中雨 北风 2级 False
data['异常值'].value_counts()
False    113
True       5
Name: 异常值, dtype: int64
# 计算异常值的方法二
sta=(data['最高气温']-data['最高气温'].mean())/data['最高气温'].std()
sta
0      0.228112
1      0.071617
2     -0.084879
3     -0.084879
4     -0.397870
         ...   
113    0.541104
114    0.854095
115    1.636573
116    2.106060
117    2.106060
Name: 最高气温, Length: 118, dtype: float64
sum(sta.abs()>2)
5
data['是否异常']= sta.abs()>2
data.head()
日期 最高气温 最低气温 天气 风向 风力 异常值 是否异常
0 2017-01-01 17 7 西北风 2级 False False
1 2017-01-02 16 8 多云 东北风 2级 False False
2 2017-01-03 15 8 多云 东北风 1级 False False
3 2017-01-04 15 11 小雨 西北风 2级 False False
4 2017-01-05 13 11 小到中雨 北风 2级 False False
data[data['是否异常']==True]
日期 最高气温 最低气温 天气 风向 风力 异常值 是否异常
102 2017-04-15 31 17 多云 南风 3级 True True
103 2017-04-16 30 21 阵雨 西南风 4级 True True
105 2017-04-18 29 16 北风 3级 True True
116 2017-04-29 29 15 西南风 3级 True True
117 2017-04-30 29 16 多云 东风 2级 True True

重复值duplicated

grade = pd.read_csv("data/1.data清洗/student_grade.txt",sep="\t")
grade_one = grade.head().copy()
grade_two = grade.iloc[3:8].copy()
data = grade_one.append(grade_two,ignore_index=True)
data[data.duplicated()] # 判断是不是重复数据
data.drop_duplicates() # 删除完全相同的行
data.drop_duplicates(subset="英语")
data.drop_duplicates(subset=["英语","语文"])
data.drop_duplicates(subset=["英语","语文"],inplace=True)
data.head()
姓名 语文 数学 英语 总分 班名次
0 杨璐 131 143 144 418 1
2 韩林霖 127 139 142 408 3
3 沙龙逸 123 148 136 407 4
4 李鉴学 126 135 140 401 5
7 韩雨萌 129 133 138 400 6
data.duplicated().sum()
0
data.duplicated().sum() 
# 检查重复值,对整行进行比较
0
sum(data.duplicated())
# 检查重复值
0
data = pd.read_csv('data/1.data清洗/hz_weather.csv')
# 检查重复值,并计算重复值的比例
data['最高气温'].duplicated().mean()
0.7796610169491526
data['最高气温'].duplicated().sum()/len(data['最高气温'])
0.7796610169491526
d2=data.drop_duplicates('最高气温') 
# drop_duplicates删除
d2
日期 最高气温 最低气温 天气 风向 风力
0 2017-01-01 17 7 西北风 2级
1 2017-01-02 16 8 多云 东北风 2级
2 2017-01-03 15 8 多云 东北风 1级
4 2017-01-05 13 11 小到中雨 北风 2级
5 2017-01-06 12 10 小雨 东北风 1级
6 2017-01-07 11 9 中雨 北风 2级
9 2017-01-10 9 4 多云 北风 1级
10 2017-01-11 8 5 小雨 北风 1级
11 2017-01-12 7 4 小雨 西南风 1级
12 2017-01-13 10 1 多云 北风 1级
19 2017-01-20 6 -3 东北风 3级
28 2017-01-29 20 4 多云 北风 3级
45 2017-02-15 18 7 南风 1级
46 2017-02-16 19 9 小雨 西南风 2级
49 2017-02-19 21 7 多云 西南风 3级
75 2017-03-19 14 10 小雨 东风 1级
84 2017-03-28 22 12 多云 西南风 3级
90 2017-04-03 23 12 多云 东风 4级
91 2017-04-04 25 15 多云 南风 4级
92 2017-04-05 26 16 北风 4级
93 2017-04-06 27 18 中雨 东风 4级
101 2017-04-14 28 16 南风 3级
102 2017-04-15 31 17 多云 南风 3级
103 2017-04-16 30 21 阵雨 西南风 4级
105 2017-04-18 29 16 北风 3级
110 2017-04-23 24 12 东风 2级
d2['最高气温'].value_counts()
31    1
30    1
7     1
8     1
9     1
10    1
11    1
12    1
13    1
14    1
15    1
16    1
17    1
18    1
19    1
20    1
21    1
22    1
23    1
24    1
25    1
26    1
27    1
28    1
29    1
6     1
Name: 最高气温, dtype: int64

9. 文本字符串的处理

import numpy as np
import pandas as pd
df_pop=pd.read_csv('data/1.data清洗/european_cities.csv')
df_pop.head()
Rank City State Population Date of census/estimate
0 1 London[2] United Kingdom 8,615,246 1 June 2014
1 2 Berlin Germany 3,437,916 31 May 2014
2 3 Madrid Spain 3,165,235 1 January 2014
3 4 Rome Italy 2,872,086 30 September 2014
4 5 Paris France 2,273,305 1 January 2013
df_pop.shape
(105, 5)
df_pop.info()

RangeIndex: 105 entries, 0 to 104
Data columns (total 5 columns):
 #   Column                   Non-Null Count  Dtype 
---  ------                   --------------  ----- 
 0   Rank                     105 non-null    int64 
 1   City                     105 non-null    object
 2   State                    105 non-null    object
 3   Population               105 non-null    object
 4   Date of census/estimate  105 non-null    object
dtypes: int64(1), object(4)
memory usage: 4.2+ KB

1 处理中间有,()之类的数据:replace(’,’,’’)

df_pop['Population'][:3]
0    8,615,246
1    3,437,916
2    3,165,235
Name: Population, dtype: object
type(df_pop['Population'][0])
str
int(df_pop['Population'][0].replace(',',''))
8615246

实现方法一:

df_pop.shape[0]
105
#方法一:
re = []  # 放置最后结果
for i in range(df_pop.shape[0]):
    re.append(int(df_pop['Population'][i].replace(',','')))
len(re)
105
df_pop['Pop'] = re
df_pop.info()

RangeIndex: 105 entries, 0 to 104
Data columns (total 6 columns):
 #   Column                   Non-Null Count  Dtype 
---  ------                   --------------  ----- 
 0   Rank                     105 non-null    int64 
 1   City                     105 non-null    object
 2   State                    105 non-null    object
 3   Population               105 non-null    object
 4   Date of census/estimate  105 non-null    object
 5   Pop                      105 non-null    int64 
dtypes: int64(2), object(4)
memory usage: 5.0+ KB
df_pop.head()
Rank City State Population Date of census/estimate Pop
0 1 London[2] United Kingdom 8,615,246 1 June 2014 8615246
1 2 Berlin Germany 3,437,916 31 May 2014 3437916
2 3 Madrid Spain 3,165,235 1 January 2014 3165235
3 4 Rome Italy 2,872,086 30 September 2014 2872086
4 5 Paris France 2,273,305 1 January 2013 2273305
df_pop.info()

RangeIndex: 105 entries, 0 to 104
Data columns (total 6 columns):
 #   Column                   Non-Null Count  Dtype 
---  ------                   --------------  ----- 
 0   Rank                     105 non-null    int64 
 1   City                     105 non-null    object
 2   State                    105 non-null    object
 3   Population               105 non-null    object
 4   Date of census/estimate  105 non-null    object
 5   Pop                      105 non-null    int64 
dtypes: int64(2), object(4)
memory usage: 5.0+ KB

实现方法二:

df_pop['Population'].apply(lambda x:int(x.replace(',','')))
0      8615246
1      3437916
2      3165235
3      2872086
4      2273305
        ...   
100     309869
101     309105
102     308735
103     308269
104     306888
Name: Population, Length: 105, dtype: int64
# 将每一行字符串进行替换处理,将,替换为空
df_pop['subtr']=df_pop['Population'].apply(lambda x:int(x.replace(',','')))
# lambda相当于函数
# def rep(x):
#     return x.replace(',','')
# apply 循环
df_pop.head()
Rank City State Population Date of census/estimate Pop subtr
0 1 London[2] United Kingdom 8,615,246 1 June 2014 8615246 8615246
1 2 Berlin Germany 3,437,916 31 May 2014 3437916 3437916
2 3 Madrid Spain 3,165,235 1 January 2014 3165235 3165235
3 4 Rome Italy 2,872,086 30 September 2014 2872086 2872086
4 5 Paris France 2,273,305 1 January 2013 2273305 2273305

2. 通常对文本型数据进行去除前后空格处理:strip()

df_pop.columns
Index(['Rank', 'City', 'State', 'Population', 'Date of census/estimate', 'Pop',
       'subtr'],
      dtype='object')
df_pop['State'].values
array([' United Kingdom', ' Germany', ' Spain', ' Italy', ' France',
       ' Romania', ' Austria', ' Germany', ' Hungary', ' Poland',
       ' Spain', ' Germany', ' Italy', ' Bulgaria', ' Czech Republic',
       ' Belgium', ' United Kingdom', ' Germany', ' Italy', ' Sweden',
       ' Italy', ' France', ' Netherlands', ' Croatia', ' Spain',
       ' Poland', ' United Kingdom', ' Poland', ' Germany', ' Latvia',
       ' Spain', ' Italy', ' Spain', ' Greece', ' Poland', ' Netherlands',
       ' Finland', ' Germany', ' United Kingdom', ' Italy', ' Germany',
       ' Germany', ' Germany', ' Spain', ' Denmark', ' United Kingdom',
       ' Portugal', ' Poland', ' Germany', ' Lithuania', ' Germany',
       ' Germany', ' Sweden', ' Ireland', ' United Kingdom', ' Germany',
       ' Netherlands', ' United Kingdom', ' Belgium', ' United Kingdom',
       ' Germany', ' Germany', ' France', ' United Kingdom', ' Poland',
       ' France', ' Spain', ' Estonia', ' United Kingdom',
       'Slovakia Slovak Republic', ' Poland', ' Spain', ' Italy',
       ' Spain', ' Italy', ' Czech Republic', ' Poland', ' Germany',
       ' Spain', ' United Kingdom', ' Poland', ' France', ' Germany',
       ' Bulgaria', ' Bulgaria', ' Spain', ' United Kingdom',
       ' Netherlands', ' Spain', ' Germany', ' United Kingdom',
       ' Denmark', ' Romania', ' United Kingdom', ' Italy', ' Greece',
       ' United Kingdom', ' Romania', ' Italy', ' Spain', ' Germany',
       ' Sweden', ' United Kingdom', ' Poland', ' Lithuania'],
      dtype=object)
df_pop['State'][0].strip() 
# strip的功能是去除前后空格
# lstrip去除左边的空格
# rstrip去除右边的空格
'United Kingdom'
str_stri=df_pop['State'].apply(lambda x: x.strip())
str_stri[10]
'Spain'
df_pop['State']=str_stri 
# 替换掉原来的国家名
df_pop['State'].values
array(['United Kingdom', 'Germany', 'Spain', 'Italy', 'France', 'Romania',
       'Austria', 'Germany', 'Hungary', 'Poland', 'Spain', 'Germany',
       'Italy', 'Bulgaria', 'Czech Republic', 'Belgium', 'United Kingdom',
       'Germany', 'Italy', 'Sweden', 'Italy', 'France', 'Netherlands',
       'Croatia', 'Spain', 'Poland', 'United Kingdom', 'Poland',
       'Germany', 'Latvia', 'Spain', 'Italy', 'Spain', 'Greece', 'Poland',
       'Netherlands', 'Finland', 'Germany', 'United Kingdom', 'Italy',
       'Germany', 'Germany', 'Germany', 'Spain', 'Denmark',
       'United Kingdom', 'Portugal', 'Poland', 'Germany', 'Lithuania',
       'Germany', 'Germany', 'Sweden', 'Ireland', 'United Kingdom',
       'Germany', 'Netherlands', 'United Kingdom', 'Belgium',
       'United Kingdom', 'Germany', 'Germany', 'France', 'United Kingdom',
       'Poland', 'France', 'Spain', 'Estonia', 'United Kingdom',
       'Slovakia Slovak Republic', 'Poland', 'Spain', 'Italy', 'Spain',
       'Italy', 'Czech Republic', 'Poland', 'Germany', 'Spain',
       'United Kingdom', 'Poland', 'France', 'Germany', 'Bulgaria',
       'Bulgaria', 'Spain', 'United Kingdom', 'Netherlands', 'Spain',
       'Germany', 'United Kingdom', 'Denmark', 'Romania',
       'United Kingdom', 'Italy', 'Greece', 'United Kingdom', 'Romania',
       'Italy', 'Spain', 'Germany', 'Sweden', 'United Kingdom', 'Poland',
       'Lithuania'], dtype=object)

3 正则表达式(pandas)

# 如果我们想要在一系列文本提取信息,可以使用正则表达式
# 正则表达式通常被用来检索某个规则的文本
import numpy as np 
import pandas as pd
df1=pd.read_csv('data/1.data清洗/getlinks.csv')
df1
title link
0 网民最喜欢的旅游目的地榜单出炉 http://cntour.cn/news/4221/
1 让生活更幸福是旅游业的使命 http://cntour.cn/news/4212/
2 “一带一路”国家中东欧游客增两倍 http://cntour.cn/news/4202/
3 旅游业改革开启旅游强国新篇章 http://cntour.cn/news/4191/
df1.shape
(4, 2)
df1['link']
0    http://cntour.cn/news/4221/
1    http://cntour.cn/news/4212/
2    http://cntour.cn/news/4202/
3    http://cntour.cn/news/4191/
Name: link, dtype: object

pandas使用str.extract提取信息

# 提取一个数字
df1['link'].str.extract('(\d)',expand=False )
# expand=False (return Index/Series)
0    4
1    4
2    4
3    4
Name: link, dtype: object
# 提取一个数字及其之后的所有数字
df1['link'].str.extract('(\d+)',expand=True )
# expand=True (return DataFrame)
0
0 4221
1 4212
2 4202
3 4191
# 提取一个数字及其之后的所有内容
df1['link'].str.extract('(\d.*)',expand=True )
0
0 4221/
1 4212/
2 4202/
3 4191/
df1['link']
0    http://cntour.cn/news/4221/
1    http://cntour.cn/news/4212/
2    http://cntour.cn/news/4202/
3    http://cntour.cn/news/4191/
Name: link, dtype: object
# 提取两个//之间的一个数字及其之后所有内容
df1['link'].str.extract('/(\d.*)/',expand=True ) 
# 括号与‘’之间的内容表示起止
0
0 4221
1 4212
2 4202
3 4191
df1['link'].str.extract('//(.+)/',expand=True  ) # 贪婪
0
0 cntour.cn/news/4221
1 cntour.cn/news/4212
2 cntour.cn/news/4202
3 cntour.cn/news/4191
df1['link'].str.extract('//(.*)/',expand=True ) # 贪婪
0
0 cntour.cn/news/4221
1 cntour.cn/news/4212
2 cntour.cn/news/4202
3 cntour.cn/news/4191
df1['link'].str.extract('//(.+?)/',expand=True ) 
# 非贪婪,?是阻止贪婪模式
0
0 cntour.cn
1 cntour.cn
2 cntour.cn
3 cntour.cn
df1['link']
0    http://cntour.cn/news/4221/
1    http://cntour.cn/news/4212/
2    http://cntour.cn/news/4202/
3    http://cntour.cn/news/4191/
Name: link, dtype: object

练习1:匹配所有的cntour
练习2:匹配出所有的news



df1['link'].str.extract('//(.*).cn')
0
0 cntour
1 cntour
2 cntour
3 cntour
df1['link'].str.extract('//(.+)\.',expand=True )
#\ 就是转义,\.表示将.变为它本来的意义
0
0 cntour
1 cntour
2 cntour
3 cntour
df1['link'].str.extract('n/(.+?)/')
0
0 news
1 news
2 news
3 news

【知识点】
*和 + 这两个限定符都是贪婪的,因为他们会尽可能多的匹配文字
当加上?,实现非贪婪匹配,也叫最小匹配

10.实战演练

df=pd.read_csv('data/1.data清洗/qunar_routes.csv')
df.head()
出发地 目的地 路线信息 酒店信息
0 杭州 丽江 机酒自由行\n丽江5日自由行,入住丽江添富太和休闲度假酒店+接送机,品古城文化,享至尊服务,... 4.4分\n高档型
1 杭州 丽江 机酒自由行\n丽江6日自由行,入住丽江添富太和休闲度假酒店+接送机,品古城文化,享至尊服务,... 4.4分\n高档型
2 杭州 丽江 机酒自由行\n丽江+香格里拉 丽江+香格里拉6日自由行,机票+特色客栈,丽江往返+接机\n特... 4.4分\n经济型
3 杭州 丽江 机酒自由行\n丽江+大理 丽江、大理双城6天自由行,3晚丽江特色客栈,2晚大理洱海边客栈,赠... 4.4分\n经济型
4 杭州 丽江 机酒自由行\n丽江5日自由行,入住丽江听心祥和院+接送机\n5天4晚|天天出发|飞机|舒适游... 4.7分\n高档型
df.shape
(120, 4)
df.info()

RangeIndex: 120 entries, 0 to 119
Data columns (total 4 columns):
 #   Column  Non-Null Count  Dtype 
---  ------  --------------  ----- 
 0   出发地     120 non-null    object
 1   目的地     120 non-null    object
 2   路线信息    120 non-null    object
 3   酒店信息    120 non-null    object
dtypes: object(4)
memory usage: 3.9+ KB
df.酒店信息[:5]
0    4.4分\n高档型
1    4.4分\n高档型
2    4.4分\n经济型
3    4.4分\n经济型
4    4.7分\n高档型
Name: 酒店信息, dtype: object
# 提取酒店评分
df["酒店评分"] = df.酒店信息.str.extract('(.+)分',expand=False)
df.head()
出发地 目的地 路线信息 酒店信息 酒店评分
0 杭州 丽江 机酒自由行\n丽江5日自由行,入住丽江添富太和休闲度假酒店+接送机,品古城文化,享至尊服务,... 4.4分\n高档型 4.4
1 杭州 丽江 机酒自由行\n丽江6日自由行,入住丽江添富太和休闲度假酒店+接送机,品古城文化,享至尊服务,... 4.4分\n高档型 4.4
2 杭州 丽江 机酒自由行\n丽江+香格里拉 丽江+香格里拉6日自由行,机票+特色客栈,丽江往返+接机\n特... 4.4分\n经济型 4.4
3 杭州 丽江 机酒自由行\n丽江+大理 丽江、大理双城6天自由行,3晚丽江特色客栈,2晚大理洱海边客栈,赠... 4.4分\n经济型 4.4
4 杭州 丽江 机酒自由行\n丽江5日自由行,入住丽江听心祥和院+接送机\n5天4晚|天天出发|飞机|舒适游... 4.7分\n高档型 4.7
# 提取酒店等级
df['酒店等级']=df.酒店信息.str.extract('\n(.*)',expand=False)
df.head()
出发地 目的地 路线信息 酒店信息 酒店评分 酒店等级
0 杭州 丽江 机酒自由行\n丽江5日自由行,入住丽江添富太和休闲度假酒店+接送机,品古城文化,享至尊服务,... 4.4分\n高档型 4.4 高档型
1 杭州 丽江 机酒自由行\n丽江6日自由行,入住丽江添富太和休闲度假酒店+接送机,品古城文化,享至尊服务,... 4.4分\n高档型 4.4 高档型
2 杭州 丽江 机酒自由行\n丽江+香格里拉 丽江+香格里拉6日自由行,机票+特色客栈,丽江往返+接机\n特... 4.4分\n经济型 4.4 经济型
3 杭州 丽江 机酒自由行\n丽江+大理 丽江、大理双城6天自由行,3晚丽江特色客栈,2晚大理洱海边客栈,赠... 4.4分\n经济型 4.4 经济型
4 杭州 丽江 机酒自由行\n丽江5日自由行,入住丽江听心祥和院+接送机\n5天4晚|天天出发|飞机|舒适游... 4.7分\n高档型 4.7 高档型
df['路线信息'][11]
'自由行\n昆明+大理+丽江+香格里拉 云南旅游新模式,分离试旅游。丽江自由行,云南/大理/丽江香格里拉10天9晚游\n洱海湾\n10天9晚|天天出发|直飞|大理金沙半岛海景养生酒店\n5.0分 | 已售23人\n\uf2442180起/人'
df['路线信息'][56]
'自由行\n丽江+大理 往返直飞丽江+泸沽湖+大理7天自由行 送特色美食旅游车接机4星入住\n多商圈, 含接送机\n7天6晚|天天出发|直飞|多酒店可选\n\uf2443198起/人'
df['路线信息'][33]
'自由行\n昆明+西双版纳+丽江 VIP私人定制环飞:私家团:昆明-西双版纳万达主题乐园-丽江冰川公园7日游!\n豪华型新城印象丽江\n7天6晚|天天出发|飞机|丽江官房大酒店旗店区\n5.0分 | 已售26人\n\uf2446080起/人专享红包团'
# 提取价格信息
df["价格"]=df.路线信息.str.extract('(\d+)起/人',expand=False)
df.head()
出发地 目的地 路线信息 酒店信息 酒店评分 酒店等级 价格
0 杭州 丽江 机酒自由行\n丽江5日自由行,入住丽江添富太和休闲度假酒店+接送机,品古城文化,享至尊服务,... 4.4分\n高档型 4.4 高档型 1888
1 杭州 丽江 机酒自由行\n丽江6日自由行,入住丽江添富太和休闲度假酒店+接送机,品古城文化,享至尊服务,... 4.4分\n高档型 4.4 高档型 1872
2 杭州 丽江 机酒自由行\n丽江+香格里拉 丽江+香格里拉6日自由行,机票+特色客栈,丽江往返+接机\n特... 4.4分\n经济型 4.4 经济型 1517
3 杭州 丽江 机酒自由行\n丽江+大理 丽江、大理双城6天自由行,3晚丽江特色客栈,2晚大理洱海边客栈,赠... 4.4分\n经济型 4.4 经济型 1612
4 杭州 丽江 机酒自由行\n丽江5日自由行,入住丽江听心祥和院+接送机\n5天4晚|天天出发|飞机|舒适游... 4.7分\n高档型 4.7 高档型 1740
# 提取天数信息
df['天数']=df.路线信息.str.extract('(\d+)天\d晚',expand=False)
df.head()
出发地 目的地 路线信息 酒店信息 酒店评分 酒店等级 价格 天数
0 杭州 丽江 机酒自由行\n丽江5日自由行,入住丽江添富太和休闲度假酒店+接送机,品古城文化,享至尊服务,... 4.4分\n高档型 4.4 高档型 1888 5
1 杭州 丽江 机酒自由行\n丽江6日自由行,入住丽江添富太和休闲度假酒店+接送机,品古城文化,享至尊服务,... 4.4分\n高档型 4.4 高档型 1872 6
2 杭州 丽江 机酒自由行\n丽江+香格里拉 丽江+香格里拉6日自由行,机票+特色客栈,丽江往返+接机\n特... 4.4分\n经济型 4.4 经济型 1517 6
3 杭州 丽江 机酒自由行\n丽江+大理 丽江、大理双城6天自由行,3晚丽江特色客栈,2晚大理洱海边客栈,赠... 4.4分\n经济型 4.4 经济型 1612 6
4 杭州 丽江 机酒自由行\n丽江5日自由行,入住丽江听心祥和院+接送机\n5天4晚|天天出发|飞机|舒适游... 4.7分\n高档型 4.7 高档型 1740 5
df.info()

RangeIndex: 120 entries, 0 to 119
Data columns (total 8 columns):
 #   Column  Non-Null Count  Dtype 
---  ------  --------------  ----- 
 0   出发地     120 non-null    object
 1   目的地     120 non-null    object
 2   路线信息    120 non-null    object
 3   酒店信息    120 non-null    object
 4   酒店评分    120 non-null    object
 5   酒店等级    120 non-null    object
 6   价格      120 non-null    object
 7   天数      119 non-null    object
dtypes: object(8)
memory usage: 7.6+ KB
# df['天数'] = df['天数'].apply(lambda x: int(x))
# 酒店评分转化为浮点数
df['酒店评分']=df['酒店评分'].apply(lambda x:float(x))
# 将价格转化为浮点数
df['价格']=df['价格'].apply(lambda x: float(x))
df.info()

RangeIndex: 120 entries, 0 to 119
Data columns (total 8 columns):
 #   Column  Non-Null Count  Dtype  
---  ------  --------------  -----  
 0   出发地     120 non-null    object 
 1   目的地     120 non-null    object 
 2   路线信息    120 non-null    object 
 3   酒店信息    120 non-null    object 
 4   酒店评分    120 non-null    float64
 5   酒店等级    120 non-null    object 
 6   价格      120 non-null    float64
 7   天数      119 non-null    object 
dtypes: float64(2), object(6)
memory usage: 7.6+ KB
# 删除固定行(比如含空值的行)
# 方法一:找到含有空值行的index,df.drop(index)
# 方法二:df[布尔索引]    (df[df[列名].notnull()])
# 方法三:df.loc[布尔索引,:] 
df[df['天数'].isnull()].index
Int64Index([88], dtype='int64')
#方法一:
df.drop(df[df['天数'].isnull()].index)
出发地 目的地 路线信息 酒店信息 酒店评分 酒店等级 价格 天数
0 杭州 丽江 机酒自由行\n丽江5日自由行,入住丽江添富太和休闲度假酒店+接送机,品古城文化,享至尊服务,... 4.4分\n高档型 4.4 高档型 1888.0 5
1 杭州 丽江 机酒自由行\n丽江6日自由行,入住丽江添富太和休闲度假酒店+接送机,品古城文化,享至尊服务,... 4.4分\n高档型 4.4 高档型 1872.0 6
2 杭州 丽江 机酒自由行\n丽江+香格里拉 丽江+香格里拉6日自由行,机票+特色客栈,丽江往返+接机\n特... 4.4分\n经济型 4.4 经济型 1517.0 6
3 杭州 丽江 机酒自由行\n丽江+大理 丽江、大理双城6天自由行,3晚丽江特色客栈,2晚大理洱海边客栈,赠... 4.4分\n经济型 4.4 经济型 1612.0 6
4 杭州 丽江 机酒自由行\n丽江5日自由行,入住丽江听心祥和院+接送机\n5天4晚|天天出发|飞机|舒适游... 4.7分\n高档型 4.7 高档型 1740.0 5
... ... ... ... ... ... ... ... ...
115 杭州 丽江 自由行\n丽江+大理+香格里拉 双飞丽江<丽江+香格里拉+大理7天自由行>赠表演+接送机+专... 4.9分\n舒适型 4.9 舒适型 2610.0 7
116 杭州 丽江 自由行\n双飞云南!全程自由行+昆明大理丽江6天5晚+N日自由行+特色客栈+接送机\n多商圈... 4.9分\n其他 4.9 其他 3020.0 6
117 杭州 丽江 自由行\n丽江+大理+香格里拉 直飞丽江9天自由行(含往返机票+20KM专用车+接送机+特色... 4.9分\n舒适型 4.9 舒适型 3418.0 9
118 杭州 丽江 自由行\n直飞丽江5天4晚自由行+N天自由行+特色客栈+接送机服务+20公里免费用车\n新城... 4.1分\n高档型 4.1 高档型 2110.0 5
119 杭州 丽江 自由行\n昆明+大理+丽江 双廊精选双飞昆明大理丽江自由行3+N天随意搭配+旅游达人推荐吃喝... 4.1分\n高档型 4.1 高档型 2199.0 6

119 rows × 8 columns

#方法二:
df[df['天数'].notnull()][80:90]
出发地 目的地 路线信息 酒店信息 酒店评分 酒店等级 价格 天数
80 杭州 丽江 自由行\n丽江+香格里拉 逼格旅行丨双飞丽江+香格里拉5日游丨宿精品客栈丨含接送机+旅途用车... 4.5分\n其他 4.5 其他 2340.0 5
81 杭州 丽江 自由行\n丽江+大理 遇见纯玩错峰游 大理丽江6天5晚奢旅自由行,杭州直飞丽江往返机票含税。... 4.1分\n舒适型 4.1 舒适型 3580.0 6
82 杭州 丽江 自由行\n丽江+大理+香格里拉 云南私家团大理+丽江+香格里拉7日6晚杨丽萍艺术酒店悦榕庄洲... 4.7分\n豪华型 4.7 豪华型 11080.0 7
83 杭州 丽江 自由行\n丽江+大理+香格里拉 直飞丽江纯玩定制5天4晚半自由行包含接送机+精选古城客栈+赠... 3.5分\n舒适型 3.5 舒适型 2690.0 5
84 杭州 丽江 自由行\n丽江+大理+香格里拉 直飞丽江 纯玩 精选TOP古城客栈(可现选)可赠送 三选一套... 4.9分\n其他 4.9 其他 2630.0 6
85 杭州 丽江 自由行\n0限制直飞昆明全程自由行+N日自由行+舒适客栈5天4晚游;赠送拉市海丽水金沙\n多... 4.9分\n其他 4.9 其他 2160.0 5
86 杭州 丽江 自由行\n丽江+大理+香格里拉 <飞机往返丽江> 丽江+大理+香格里拉4天自由行+管家式服务... 4.9分\n其他 4.9 其他 2380.0 4
87 杭州 丽江 自由行\n丽江+香格里拉 双飞丽江<丽江+香格里拉+泸沽湖7天自由行>赠表演+接送机+专车使... 4.9分\n舒适型 4.9 舒适型 2670.0 7
89 杭州 丽江 自由行\n丽江+大理+香格里拉 直飞丽江 定制纯玩自由行(特色客栈+香格里拉+泸沽湖+大理多... 4.9分\n其他 4.9 其他 2740.0 6
90 杭州 丽江 自由行\n丽江+香格里拉 <双飞往返丽江+香格里拉5天自由行>赠丽水金沙+接送机+专车使用(... 4.9分\n舒适型 4.9 舒适型 2370.0 5
# 将酒店评分转换成浮点数
df['酒店评分']=df['酒店评分'].apply(lambda x: float(x))
# df['天数'].apply(lambda x: int(x)) 说明天数里面有空值
df.info()

RangeIndex: 120 entries, 0 to 119
Data columns (total 8 columns):
 #   Column  Non-Null Count  Dtype  
---  ------  --------------  -----  
 0   出发地     120 non-null    object 
 1   目的地     120 non-null    object 
 2   路线信息    120 non-null    object 
 3   酒店信息    120 non-null    object 
 4   酒店评分    120 non-null    float64
 5   酒店等级    120 non-null    object 
 6   价格      120 non-null    float64
 7   天数      119 non-null    object 
dtypes: float64(2), object(6)
memory usage: 7.6+ KB
# 确认天数有没有空值
df['天数'].isnull().sum()
# 删除天数为空值的那一行
df=df.loc[df['天数'].notnull(),:]
df.info()

Int64Index: 119 entries, 0 to 119
Data columns (total 8 columns):
 #   Column  Non-Null Count  Dtype  
---  ------  --------------  -----  
 0   出发地     119 non-null    object 
 1   目的地     119 non-null    object 
 2   路线信息    119 non-null    object 
 3   酒店信息    119 non-null    object 
 4   酒店评分    119 non-null    float64
 5   酒店等级    119 non-null    object 
 6   价格      119 non-null    float64
 7   天数      119 non-null    object 
dtypes: float64(2), object(6)
memory usage: 8.4+ KB
# 将天数转换为整数
df['天数']=df['天数'].apply(lambda x:int(x))
df.info()

Int64Index: 119 entries, 0 to 119
Data columns (total 8 columns):
 #   Column  Non-Null Count  Dtype  
---  ------  --------------  -----  
 0   出发地     119 non-null    object 
 1   目的地     119 non-null    object 
 2   路线信息    119 non-null    object 
 3   酒店信息    119 non-null    object 
 4   酒店评分    119 non-null    float64
 5   酒店等级    119 non-null    object 
 6   价格      119 non-null    float64
 7   天数      119 non-null    int64  
dtypes: float64(2), int64(1), object(5)
memory usage: 8.4+ KB
# 重置索引
df.index = range(df.shape[0])
df.info()

RangeIndex: 119 entries, 0 to 118
Data columns (total 8 columns):
 #   Column  Non-Null Count  Dtype  
---  ------  --------------  -----  
 0   出发地     119 non-null    object 
 1   目的地     119 non-null    object 
 2   路线信息    119 non-null    object 
 3   酒店信息    119 non-null    object 
 4   酒店评分    119 non-null    float64
 5   酒店等级    119 non-null    object 
 6   价格      119 non-null    float64
 7   天数      119 non-null    int64  
dtypes: float64(2), int64(1), object(5)
memory usage: 7.6+ KB
df.head()
出发地 目的地 路线信息 酒店信息 酒店评分 酒店等级 价格 天数
0 杭州 丽江 机酒自由行\n丽江5日自由行,入住丽江添富太和休闲度假酒店+接送机,品古城文化,享至尊服务,... 4.4分\n高档型 4.4 高档型 1888.0 5
1 杭州 丽江 机酒自由行\n丽江6日自由行,入住丽江添富太和休闲度假酒店+接送机,品古城文化,享至尊服务,... 4.4分\n高档型 4.4 高档型 1872.0 6
2 杭州 丽江 机酒自由行\n丽江+香格里拉 丽江+香格里拉6日自由行,机票+特色客栈,丽江往返+接机\n特... 4.4分\n经济型 4.4 经济型 1517.0 6
3 杭州 丽江 机酒自由行\n丽江+大理 丽江、大理双城6天自由行,3晚丽江特色客栈,2晚大理洱海边客栈,赠... 4.4分\n经济型 4.4 经济型 1612.0 6
4 杭州 丽江 机酒自由行\n丽江5日自由行,入住丽江听心祥和院+接送机\n5天4晚|天天出发|飞机|舒适游... 4.7分\n高档型 4.7 高档型 1740.0 5
# 处理酒店等级字段
df['酒店等级'].value_counts()
舒适型    38
其他     32
高档型    24
豪华型    20
经济型     5
Name: 酒店等级, dtype: int64
dic={
     '其他':0,'经济型':1,'舒适型':2,'高档型':3,'豪华型':4}
df['酒店等级'][:5]
0    高档型
1    高档型
2    经济型
3    经济型
4    高档型
Name: 酒店等级, dtype: object
df['酒店等级'].map(dic)[:5]
0    3
1    3
2    1
3    1
4    3
Name: 酒店等级, dtype: int64
df['酒店等级']=df['酒店等级'].map(dic)
df.info()

RangeIndex: 119 entries, 0 to 118
Data columns (total 8 columns):
 #   Column  Non-Null Count  Dtype  
---  ------  --------------  -----  
 0   出发地     119 non-null    object 
 1   目的地     119 non-null    object 
 2   路线信息    119 non-null    object 
 3   酒店信息    119 non-null    object 
 4   酒店评分    119 non-null    float64
 5   酒店等级    119 non-null    int64  
 6   价格      119 non-null    float64
 7   天数      119 non-null    int64  
dtypes: float64(2), int64(2), object(4)
memory usage: 7.6+ KB
df.head()
出发地 目的地 路线信息 酒店信息 酒店评分 酒店等级 价格 天数
0 杭州 丽江 机酒自由行\n丽江5日自由行,入住丽江添富太和休闲度假酒店+接送机,品古城文化,享至尊服务,... 4.4分\n高档型 4.4 3 1888.0 5
1 杭州 丽江 机酒自由行\n丽江6日自由行,入住丽江添富太和休闲度假酒店+接送机,品古城文化,享至尊服务,... 4.4分\n高档型 4.4 3 1872.0 6
2 杭州 丽江 机酒自由行\n丽江+香格里拉 丽江+香格里拉6日自由行,机票+特色客栈,丽江往返+接机\n特... 4.4分\n经济型 4.4 1 1517.0 6
3 杭州 丽江 机酒自由行\n丽江+大理 丽江、大理双城6天自由行,3晚丽江特色客栈,2晚大理洱海边客栈,赠... 4.4分\n经济型 4.4 1 1612.0 6
4 杭州 丽江 机酒自由行\n丽江5日自由行,入住丽江听心祥和院+接送机\n5天4晚|天天出发|飞机|舒适游... 4.7分\n高档型 4.7 3 1740.0 5

数据处理好之后,便可以选取特征带入模型,进行预测

import matplotlib.pyplot as plt

plt.rcParams['font.sans-serif']=['Simhei']  # 显示中文
plt.rcParams['axes.unicode_minus']=False    # 显示负号
# 对变量画直方图,查看是否有异常值
fig, axes = plt.subplots(1, 3, figsize=(12, 4))  #创建画布(1*3个画布)

df["酒店等级"].plot(ax=axes[0], kind='hist', title="酒店等级")
df["酒店评分"].plot(ax=axes[1], kind='hist', title="酒店评分")
df["价格"].plot(ax=axes[2], kind='hist', title="价格");

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-5bGQzXzg-1633320025791)(output_283_0.png)]

11. 时序数据处理

import time
import datetime as dt
import pandas as pd
import numpy as np
time.time()
# 时间戳,可以计算时间的距离
# 时间戳是指格林威治时间自1970年1月1日(00:00:00 GMT)至当前时间的总秒数。
# 北京时间1970.1.1(08:00:00)
1610678087.3518448

1.获取系统时间

time.localtime()
time.struct_time(tm_year=2021, tm_mon=1, tm_mday=15, tm_hour=10, tm_min=34, tm_sec=50, tm_wday=4, tm_yday=15, tm_isdst=0)

2.将系统时间格式化

time.strftime

  • %Y Year with century as a decimal number.
  • %m Month as a decimal number [01,12].
  • %d Day of the month as a decimal number [01,31].
  • %H Hour (24-hour clock) as a decimal number [00,23].
  • %M Minute as a decimal number [00,59].
  • %S Second as a decimal number [00,61].
  • %z Time zone offset from UTC.
  • %a Locale’s abbreviated weekday name.
  • %A Locale’s full weekday name.
  • %b Locale’s abbreviated month name.
  • %B Locale’s full month name.
  • %c Locale’s appropriate date and time representation.
  • %I Hour (12-hour clock) as a decimal number [01,12].
  • %p Locale’s equivalent of either AM or PM.
time.strftime('%Y-%m-%d',time.localtime())
'2021-01-15'
time.strftime('%Y-%m-%d %H:%M:%S',time.localtime())
'2021-01-15 10:35:30'

3.将系统时间转换为时间戳

time.mktime

  • year (including century, e.g. 1998)
  • month (1-12)
  • day (1-31)
  • hours (0-23)
  • minutes (0-59)
  • seconds (0-59)
  • weekday (0-6, Monday is 0)
  • Julian day (day in the year, 1-366)
  • DST (Daylight Savings Time) flag (-1, 0 or 1)
time.localtime()
time.struct_time(tm_year=2021, tm_mon=1, tm_mday=15, tm_hour=10, tm_min=37, tm_sec=19, tm_wday=4, tm_yday=15, tm_isdst=0)
time.mktime(time.localtime())
1610678241.0

4.将时间戳转换成系统时间

time.localtime(1552922267.0)
time.struct_time(tm_year=2019, tm_mon=3, tm_mday=18, tm_hour=23, tm_min=17, tm_sec=47, tm_wday=0, tm_yday=77, tm_isdst=0)
time.strftime('%Y-%m-%d %H:%M:%S',time.localtime(1552922267.0))
'2019-03-18 23:17:47'

5.时间数据的操作

dt.datetime
# datetime(year, month, day[, hour[, minute[, second[, microsecond[,tzinfo]]]]])
datetime.datetime
dt.datetime(2019,3,20)
datetime.datetime(2019, 3, 20, 0, 0)
pd.date_range
# 生成时间序列
 pandas.core.indexes.datetimes.DatetimeIndex>
pd.date_range(dt.datetime(2019,3,20),periods=4)
DatetimeIndex(['2019-03-20', '2019-03-21', '2019-03-22', '2019-03-23'], dtype='datetime64[ns]', freq='D')
pd.date_range('2019-3-20',periods=4)
# 指定开始日期和生成的个数,默认按照day(freq='D')
DatetimeIndex(['2019-03-20', '2019-03-21', '2019-03-22', '2019-03-23'], dtype='datetime64[ns]', freq='D')
pd.date_range('2019-3-20','2019-4-20')
# 指定起始日期
DatetimeIndex(['2019-03-20', '2019-03-21', '2019-03-22', '2019-03-23',
               '2019-03-24', '2019-03-25', '2019-03-26', '2019-03-27',
               '2019-03-28', '2019-03-29', '2019-03-30', '2019-03-31',
               '2019-04-01', '2019-04-02', '2019-04-03', '2019-04-04',
               '2019-04-05', '2019-04-06', '2019-04-07', '2019-04-08',
               '2019-04-09', '2019-04-10', '2019-04-11', '2019-04-12',
               '2019-04-13', '2019-04-14', '2019-04-15', '2019-04-16',
               '2019-04-17', '2019-04-18', '2019-04-19', '2019-04-20'],
              dtype='datetime64[ns]', freq='D')
pd.date_range('2019-3-20 11:00','2019-3-20 23:00',freq='H')
# 按小时生成时间序列
DatetimeIndex(['2019-03-20 11:00:00', '2019-03-20 12:00:00',
               '2019-03-20 13:00:00', '2019-03-20 14:00:00',
               '2019-03-20 15:00:00', '2019-03-20 16:00:00',
               '2019-03-20 17:00:00', '2019-03-20 18:00:00',
               '2019-03-20 19:00:00', '2019-03-20 20:00:00',
               '2019-03-20 21:00:00', '2019-03-20 22:00:00',
               '2019-03-20 23:00:00'],
              dtype='datetime64[ns]', freq='H')
ser=pd.Series(np.arange(10),index=pd.date_range('2019-3-20',periods=10))
# 生成一个以时间序列为索引的series序列
ser
2019-03-20    0
2019-03-21    1
2019-03-22    2
2019-03-23    3
2019-03-24    4
2019-03-25    5
2019-03-26    6
2019-03-27    7
2019-03-28    8
2019-03-29    9
Freq: D, dtype: int32
ser['2019-03-25']
5
print(ser.index[2])
# 打印第3个索引值
2019-03-22 00:00:00
ser.index[2].year
2019
ser.index[2].month
3
ser.index[2].day
22
ser.index[2].week
12

6.简单的时序分析

data=pd.read_csv('data/1.data清洗/hz_weather.csv')
data.head()
日期 最高气温 最低气温 天气 风向 风力
0 2017-01-01 17 7 西北风 2级
1 2017-01-02 16 8 多云 东北风 2级
2 2017-01-03 15 8 多云 东北风 1级
3 2017-01-04 15 11 小雨 西北风 2级
4 2017-01-05 13 11 小到中雨 北风 2级
df=data[['日期','最高气温','最低气温']]
df.head()
日期 最高气温 最低气温
0 2017-01-01 17 7
1 2017-01-02 16 8
2 2017-01-03 15 8
3 2017-01-04 15 11
4 2017-01-05 13 11
df.info()

RangeIndex: 118 entries, 0 to 117
Data columns (total 3 columns):
 #   Column  Non-Null Count  Dtype 
---  ------  --------------  ----- 
 0   日期      118 non-null    object
 1   最高气温    118 non-null    int64 
 2   最低气温    118 non-null    int64 
dtypes: int64(2), object(1)
memory usage: 2.9+ KB
# 1.修改日期格式
df.loc[:,'日期']=pd.to_datetime(df['日期'].values,format='%Y-%m-%d')
df.info()

RangeIndex: 118 entries, 0 to 117
Data columns (total 3 columns):
 #   Column  Non-Null Count  Dtype         
---  ------  --------------  -----         
 0   日期      118 non-null    datetime64[ns]
 1   最高气温    118 non-null    int64         
 2   最低气温    118 non-null    int64         
dtypes: datetime64[ns](1), int64(2)
memory usage: 2.9 KB
# 2、将日期设置为索引
df.set_index('日期',inplace=True)
df.index
DatetimeIndex(['2017-01-01', '2017-01-02', '2017-01-03', '2017-01-04',
               '2017-01-05', '2017-01-06', '2017-01-07', '2017-01-08',
               '2017-01-09', '2017-01-10',
               ...
               '2017-04-21', '2017-04-22', '2017-04-23', '2017-04-24',
               '2017-04-25', '2017-04-26', '2017-04-27', '2017-04-28',
               '2017-04-29', '2017-04-30'],
              dtype='datetime64[ns]', name='日期', length=118, freq=None)
df.index<'2017-3-1'
array([ True,  True,  True,  True,  True,  True,  True,  True,  True,
        True,  True,  True,  True,  True,  True,  True,  True,  True,
        True,  True,  True,  True,  True,  True,  True,  True,  True,
        True,  True,  True,  True,  True,  True,  True,  True,  True,
        True,  True,  True,  True,  True,  True,  True,  True,  True,
        True,  True,  True,  True,  True,  True,  True,  True,  True,
        True,  True,  True,  True,  True, False, False, False, False,
       False, False, False, False, False, False, False, False, False,
       False, False, False, False, False, False, False, False, False,
       False, False, False, False, False, False, False, False, False,
       False, False, False, False, False, False, False, False, False,
       False, False, False, False, False, False, False, False, False,
       False, False, False, False, False, False, False, False, False,
       False])
# 提取1月份的数据
df_jan=df[(df.index>='2017-1-1')&(df.index<'2017-2-1')]
df_jan.info()

DatetimeIndex: 31 entries, 2017-01-01 to 2017-01-31
Data columns (total 2 columns):
 #   Column  Non-Null Count  Dtype
---  ------  --------------  -----
 0   最高气温    31 non-null     int64
 1   最低气温    31 non-null     int64
dtypes: int64(2)
memory usage: 744.0 bytes
df['2017-1-1':'2017-1-31']
最高气温 最低气温
日期
2017-01-01 17 7
2017-01-02 16 8
2017-01-03 15 8
2017-01-04 15 11
2017-01-05 13 11
2017-01-06 12 10
2017-01-07 11 9
2017-01-08 12 5
2017-01-09 11 4
2017-01-10 9 4
2017-01-11 8 5
2017-01-12 7 4
2017-01-13 10 1
2017-01-14 10 2
2017-01-15 8 2
2017-01-16 9 2
2017-01-17 11 7
2017-01-18 8 6
2017-01-19 8 0
2017-01-20 6 -3
2017-01-21 7 -1
2017-01-22 8 -2
2017-01-23 8 -1
2017-01-24 9 3
2017-01-25 10 2
2017-01-26 13 3
2017-01-27 13 5
2017-01-28 17 7
2017-01-29 20 4
2017-01-30 8 0
2017-01-31 8 3
# 转换成月份
df.to_period('M').head()
最高气温 最低气温
日期
2017-01 17 7
2017-01 16 8
2017-01 15 8
2017-01 15 11
2017-01 13 11

你可能感兴趣的:(python,python)