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')
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.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 |
新款中老年女装春装雪纺打底衫妈妈装夏装中袖宽松上衣中年人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 |
新款中老年女装春装雪纺打底衫妈妈装夏装中袖宽松上衣中年人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,:]
|
宝贝 |
价格 |
成交量 |
卖家 |
位置 |
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,:]
|
宝贝 |
价格 |
成交量 |
卖家 |
位置 |
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(['宝贝', '价格'])]
|
宝贝 |
价格 |
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]
|
宝贝 |
价格 |
0 |
新款中老年女装春装雪纺打底衫妈妈装夏装中袖宽松上衣中年人t恤 |
99.0 |
1 |
中老年女装清凉两件套妈妈装夏装大码短袖T恤上衣雪纺衫裙裤套装 |
286.0 |
2 |
母亲节衣服夏季妈妈装夏装套装短袖中年人40-50岁中老年女装T恤 |
298.0 |
df.loc[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]]
|
宝贝 |
价格 |
0 |
新款中老年女装春装雪纺打底衫妈妈装夏装中袖宽松上衣中年人t恤 |
99.0 |
1 |
中老年女装清凉两件套妈妈装夏装大码短袖T恤上衣雪纺衫裙裤套装 |
286.0 |
2 |
母亲节衣服夏季妈妈装夏装套装短袖中年人40-50岁中老年女装T恤 |
298.0 |
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})
|
价格 |
成交量 |
销售额 |
位置 |
|
|
|
上海 |
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、数据的分割与合并
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 |
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 |
江苏 |
高康洁 |
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(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')
|
位置 |
卖家 |
价格 |
成交量 |
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 |
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])
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)
|
宝贝 |
价格 |
成交量 |
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()
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'
,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'
,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()
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})
|
|
价格 |
出发地 |
目的地 |
|
上海 |
三亚 |
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 |
缺失值的填充
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 |
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 |
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 |
异常值的处理
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()
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('最高气温')
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(',','')))
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()
'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 )
0 4
1 4
2 4
3 4
Name: link, dtype: object
df1['link'].str.extract('(\d+)',expand=True )
|
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: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
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.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))
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()
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.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)
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))
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])
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
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
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])
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 |