数据清洗(二):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.016647夏奈凤凰旗舰店江苏
1中老年女装清凉两件套妈妈装夏装大码短袖T恤上衣雪纺衫裙裤套装286.014045夏洛特的文艺上海
2母亲节衣服夏季妈妈装夏装套装短袖中年人40-50岁中老年女装T恤298.013458云新旗舰店江苏
3母亲节衣服中老年人春装女40岁50中年妈妈装套装夏装奶奶装两件套279.013340韶妃旗舰店浙江
4中老年女装春夏装裤大码 中年妇女40-50岁妈妈装夏装套装七分裤59.012939千百奈旗舰店江苏
#查看数据集后3行
df.tail(3)
宝贝价格成交量卖家位置
97母亲节妈妈装夏装套装女40-50岁夏季衣服两件套中老年春装连衣裙195.04000若澜锦蒂旗舰店浙江
98母亲节衣服夏季中老年女装夏装短袖套装雪纺衫T恤妈妈装两件套498.03968蕴涵旗舰店江苏
99中老年女装春装t恤纱袖针织衫40-50岁妈妈装七分袖上衣夏装打底衫688.03956潮流前线9170浙江

2、数据的探索

#查看数据集形状
df.shape
(100, 5)
#快速了解数据的结构
df.info()
<class 'pandas.core.frame.DataFrame'>
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()
价格成交量
count100.000000100.00000
mean231.6690006388.93000
std130.9710612770.07536
min29.0000003956.00000
25%128.7500004476.50000
50%198.0000005314.50000
75%298.0000007053.75000
max698.00000016647.00000

3、数据的选择与整理

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

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

列的选择——三种方法选取前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]]
价格卖家
70320.0朵莹旗舰店
71318.0晨旭服饰678
72177.0步古旗舰店
73288.0妈妈装工厂店1988
74218.0第二号鞋铺
df.iloc[70:75,[1,3]]
价格卖家
70320.0朵莹旗舰店
71318.0晨旭服饰678
72177.0步古旗舰店
73288.0妈妈装工厂店1988
74218.0第二号鞋铺
df.columns.get_indexer(['价格', '卖家'])
array([1, 3], dtype=int64)
df.iloc[70:75,df.columns.get_indexer(['价格', '卖家'])]
价格卖家
70320.0朵莹旗舰店
71318.0晨旭服饰678
72177.0步古旗舰店
73288.0妈妈装工厂店1988
74218.0第二号鞋铺

数据的整理

  • 增加一列销售额
  • 过滤掉价格>=100,成交量<8000的商品信息
df.head(2)
宝贝价格成交量卖家位置
0新款中老年女装春装雪纺打底衫妈妈装夏装中袖宽松上衣中年人t恤99.016647夏奈凤凰旗舰店江苏
1中老年女装清凉两件套妈妈装夏装大码短袖T恤上衣雪纺衫裙裤套装286.014045夏洛特的文艺上海
df['销售额'] = df['价格'] * df['成交量']
df.head(2)
宝贝价格成交量卖家位置销售额
0新款中老年女装春装雪纺打底衫妈妈装夏装中袖宽松上衣中年人t恤99.016647夏奈凤凰旗舰店江苏1648053.0
1中老年女装清凉两件套妈妈装夏装大码短袖T恤上衣雪纺衫裙裤套装286.014045夏洛特的文艺上海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.016647夏奈凤凰旗舰店江苏1648053.0
4中老年女装春夏装裤大码 中年妇女40-50岁妈妈装夏装套装七分裤59.012939千百奈旗舰店江苏763401.0
df.index[(df['价格']<100) & (df['成交量']>=8000)]
Int64Index([0, 4], dtype='int64')
df.iloc[df.index[(df.价格<100) & (df.成交量>=8000)],:]
宝贝价格成交量卖家位置销售额
0新款中老年女装春装雪纺打底衫妈妈装夏装中袖宽松上衣中年人t恤99.016647夏奈凤凰旗舰店江苏1648053.0
4中老年女装春夏装裤大码 中年妇女40-50岁妈妈装夏装套装七分裤59.012939千百奈旗舰店江苏763401.0
df.loc[(df.价格<100) & (df.成交量>=8000),:]
宝贝价格成交量卖家位置销售额
0新款中老年女装春装雪纺打底衫妈妈装夏装中袖宽松上衣中年人t恤99.016647夏奈凤凰旗舰店江苏1648053.0
4中老年女装春夏装裤大码 中年妇女40-50岁妈妈装夏装套装七分裤59.012939千百奈旗舰店江苏763401.0
df[~(df.价格>=100) & ~(df.成交量<8000)]
宝贝价格成交量卖家位置销售额
0新款中老年女装春装雪纺打底衫妈妈装夏装中袖宽松上衣中年人t恤99.016647夏奈凤凰旗舰店江苏1648053.0
4中老年女装春夏装裤大码 中年妇女40-50岁妈妈装夏装套装七分裤59.012939千百奈旗舰店江苏763401.0

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

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

4、数据的分组

df.head()
宝贝价格成交量卖家位置销售额
0新款中老年女装春装雪纺打底衫妈妈装夏装中袖宽松上衣中年人t恤99.016647夏奈凤凰旗舰店江苏1648053.0
1中老年女装清凉两件套妈妈装夏装大码短袖T恤上衣雪纺衫裙裤套装286.014045夏洛特的文艺上海4016870.0
2母亲节衣服夏季妈妈装夏装套装短袖中年人40-50岁中老年女装T恤298.013458云新旗舰店江苏4010484.0
3母亲节衣服中老年人春装女40岁50中年妈妈装套装夏装奶奶装两件套279.013340韶妃旗舰店浙江3721860.0
4中老年女装春夏装裤大码 中年妇女40-50岁妈妈装夏装套装七分裤59.012939千百奈旗舰店江苏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.2000006801.5000001.256211e+06
北京150.0000004519.3333336.846817e+05
广东326.0000005164.0000001.683464e+06
江苏223.6113647030.9090911.551363e+06
河北152.0000006050.6666679.224000e+05
河南119.0000005986.0000007.123340e+05
浙江290.4285715779.5000001.650173e+06
湖北254.7142866182.0000001.536022e+06
# 根据位置进行索引,然后求价格的均值,成交量的总和,销售额的均值
df.groupby(df['位置']).agg({'价格':np.mean,'成交量':np.sum,'销售额':np.mean})
# agg是聚合函数 aggregation的缩写
价格成交量销售额
位置
上海161.200000680151.256211e+06
北京150.000000271166.846817e+05
广东326.00000051641.683464e+06
江苏223.6113643093601.551363e+06
河北152.000000181529.224000e+05
河南119.00000059867.123340e+05
浙江290.4285711618261.650173e+06
湖北254.714286432741.536022e+06
# 按多组列进行分组汇总
df.groupby([df['位置'],df['卖家']]).mean()
# 默认将分组的列作为索引
价格成交量销售额
位置卖家
上海xudong15899.04572.0452628.0
佳福妈妈商城29.04752.0137808.0
夏洛特的文艺286.014045.04016870.0
妃莲慕旗舰店133.05377.5718505.0
婆家娘家商城198.05304.01050192.0
...............
湖北凯利娜格旗舰店178.04111.0731758.0
千百萌旗舰店199.012398.02467202.0
千香旗舰店158.05001.0790158.0
欧芮嘉旗舰店368.04041.01487088.0
薇诗琪旗舰店318.08580.02728440.0

85 rows × 3 columns

# 直接使用列名进行分组
df.groupby('位置').mean()
# 将指定的字段作为索引,对所有的数值型字段进行汇总计算
价格成交量销售额
位置
上海161.2000006801.5000001.256211e+06
北京150.0000004519.3333336.846817e+05
广东326.0000005164.0000001.683464e+06
江苏223.6113647030.9090911.551363e+06
河北152.0000006050.6666679.224000e+05
河南119.0000005986.0000007.123340e+05
浙江290.4285715779.5000001.650173e+06
湖北254.7142866182.0000001.536022e+06
df.groupby(['位置','卖家']).mean()
价格成交量销售额
位置卖家
上海xudong15899.04572.0452628.0
佳福妈妈商城29.04752.0137808.0
夏洛特的文艺286.014045.04016870.0
妃莲慕旗舰店133.05377.5718505.0
婆家娘家商城198.05304.01050192.0
...............
湖北凯利娜格旗舰店178.04111.0731758.0
千百萌旗舰店199.012398.02467202.0
千香旗舰店158.05001.0790158.0
欧芮嘉旗舰店368.04041.01487088.0
薇诗琪旗舰店318.08580.02728440.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.016647夏奈凤凰旗舰店江苏1648053.0
1中老年女装清凉两件套妈妈装夏装大码短袖T恤上衣雪纺衫裙裤套装286.014045夏洛特的文艺上海4016870.0
2母亲节衣服夏季妈妈装夏装套装短袖中年人40-50岁中老年女装T恤298.013458云新旗舰店江苏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.07046
26康乃馨老年装128.07002
27妈咪衣橱纺396.06929
28爱莱嘉旗舰店49.06816
29高康洁108.06795
30蒲洛妃旗舰店108.06755
31悦薇孔雀旗舰店298.06270
32摩尼树旗舰店198.06262
33梵忆轩旗舰店148.06224
34loueddssd倍艾旗舰店198.06168
35蒲洛妃旗舰店258.06085
#方法二
df2 = df.loc[25:35,['卖家','价格','成交量']]
df2
卖家价格成交量
25衣之绒旗舰店399.07046
26康乃馨老年装128.07002
27妈咪衣橱纺396.06929
28爱莱嘉旗舰店49.06816
29高康洁108.06795
30蒲洛妃旗舰店108.06755
31悦薇孔雀旗舰店298.06270
32摩尼树旗舰店198.06262
33梵忆轩旗舰店148.06224
34loueddssd倍艾旗舰店198.06168
35蒲洛妃旗舰店258.06085
#方法三
df2 = df.iloc[25:36,[3,1,2]]
df2
卖家价格成交量
25衣之绒旗舰店399.07046
26康乃馨老年装128.07002
27妈咪衣橱纺396.06929
28爱莱嘉旗舰店49.06816
29高康洁108.06795
30蒲洛妃旗舰店108.06755
31悦薇孔雀旗舰店298.06270
32摩尼树旗舰店198.06262
33梵忆轩旗舰店148.06224
34loueddssd倍艾旗舰店198.06168
35蒲洛妃旗舰店258.06085
# pd.merge()根据一个或多个key值,将dataframe连接(join)
# pd.concat()沿着一个轴将多个对象堆叠起来
# combine_first()如果有缺失值,另外一个数据集根据对齐进行填充
pd.merge(df1,df2)
位置卖家价格成交量
0江苏衣之绒旗舰店399.07046
1江苏康乃馨老年装128.07002
2江苏妈咪衣橱纺396.06929
3江苏爱莱嘉旗舰店49.06816
4江苏高康洁108.06795
pd.merge(df1,df2,how='right')
位置卖家价格成交量
0江苏衣之绒旗舰店399.07046
1江苏康乃馨老年装128.07002
2江苏妈咪衣橱纺396.06929
3江苏爱莱嘉旗舰店49.06816
4江苏高康洁108.06795
5NaN蒲洛妃旗舰店108.06755
6NaN蒲洛妃旗舰店258.06085
7NaN悦薇孔雀旗舰店298.06270
8NaN摩尼树旗舰店198.06262
9NaN梵忆轩旗舰店148.06224
10NaNloueddssd倍艾旗舰店198.06168
pd.merge(df1,df2,on='卖家')
位置卖家价格成交量
0江苏衣之绒旗舰店399.07046
1江苏康乃馨老年装128.07002
2江苏妈咪衣橱纺396.06929
3江苏爱莱嘉旗舰店49.06816
4江苏高康洁108.06795
pd.merge(df1,df2,how='inner')
#通常情况下,前一个是左表,后一个是右表
#how默认为inner,还可以使用outer、left、right
位置卖家价格成交量
0江苏衣之绒旗舰店399.07046
1江苏康乃馨老年装128.07002
2江苏妈咪衣橱纺396.06929
3江苏爱莱嘉旗舰店49.06816
4江苏高康洁108.06795
# 按照索引合并
pd.merge(df1,df2,left_index=True,right_index=True)
位置卖家_x卖家_y价格成交量
25江苏衣之绒旗舰店衣之绒旗舰店399.07046
26江苏康乃馨老年装康乃馨老年装128.07002
27江苏妈咪衣橱纺妈咪衣橱纺396.06929
28江苏爱莱嘉旗舰店爱莱嘉旗舰店49.06816
29江苏高康洁高康洁108.06795
# 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.016647
1中老年女装清凉两件套妈妈装夏装大码短袖T恤上衣雪纺衫裙裤套装286.014045
2母亲节衣服夏季妈妈装夏装套装短袖中年人40-50岁中老年女装T恤298.013458
3母亲节衣服中老年人春装女40岁50中年妈妈装套装夏装奶奶装两件套279.013340
4中老年女装春夏装裤大码 中年妇女40-50岁妈妈装夏装套装七分裤59.012939
5中老年女装夏装短袖T恤40-50岁中年春装30打底衫妈妈装母亲节衣服198.012664
cols_1=df[:6][['宝贝','位置']]
cols_2=df[:6][['价格','成交量']]
cols_2
价格成交量
099.016647
1286.014045
2298.013458
3279.013340
459.012939
5198.012664
pd.concat([cols_1,cols_2],axis=1)
宝贝位置价格成交量
0新款中老年女装春装雪纺打底衫妈妈装夏装中袖宽松上衣中年人t恤江苏99.016647
1中老年女装清凉两件套妈妈装夏装大码短袖T恤上衣雪纺衫裙裤套装上海286.014045
2母亲节衣服夏季妈妈装夏装套装短袖中年人40-50岁中老年女装T恤江苏298.013458
3母亲节衣服中老年人春装女40岁50中年妈妈装套装夏装奶奶装两件套浙江279.013340
4中老年女装春夏装裤大码 中年妇女40-50岁妈妈装夏装套装七分裤江苏59.012939
5中老年女装夏装短袖T恤40-50岁中年春装30打底衫妈妈装母亲节衣服江苏198.012664

6、数据的重塑与透视

6.1 数据的重塑

data = pd.read_csv('data/1.data清洗/hz_weather.csv')
data.head(2)
日期最高气温最低气温天气风向风力
02017-01-01177西北风2级
12017-01-02168多云东北风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()
日期最高气温最低气温天气风向风力
02017-01-01177西北风2级
12017-01-02168多云东北风2级
22017-01-03158多云东北风1级
32017-01-041511小雨西北风2级
42017-01-051311小到中雨北风2级

6.2 数据的透视

df = data.set_index('日期')
df.head(3)
最高气温最低气温天气风向风力
日期
2017-01-01177西北风2级
2017-01-02168多云东北风2级
2017-01-03158多云东北风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级微风总计
天气
中雨NaN11.011.027.0NaNNaNNaN27
多云17.029.031.026.016.025.0NaN31
小到中雨NaN13.0NaNNaNNaNNaNNaN13
小雨14.019.015.019.0NaNNaN13.019
18.026.029.027.0NaN19.015.029
16.018.014.026.0NaNNaNNaN26
阵雨NaN21.026.030.019.0NaNNaN30
雨夹雪NaNNaNNaN7.0NaNNaNNaN7
总计18.029.031.030.019.025.015.031


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


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.06.0NaNNaNNaN-3
东南风0.0-1.012.0NaNNaNNaNNaN-1
东风0.02.02.011.0NaNNaNNaN0
北风-1.03.0-1.0-1.07.016.03.0-1
南风2.03.016.015.0NaNNaNNaN2
西北风NaN7.0NaNNaNNaN6.0NaN6
西南风4.09.07.021.0NaNNaNNaN4
总计-1.0-2.0-3.0-1.07.06.03.0-3

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

  • 1.按照出发地和目的地,生成旅游路线的平均价格汇总表
  • 2.汇总一个大表,包含出发地——目的地,路线总数以及平均价格
  • 3.查看出发地目的地的平均价格的透视分析
  • 4.从杭州出发—目的地-去程方式-平均价格的数据透视表
df_free=pd.read_csv('data/1.data清洗/qunar_free_trip.csv')
df_free.head(2)
出发地目的地价格节省路线名酒店房间去程航司去程方式去程时间回程航司回程方式回程时间
0北京厦门1866492北京-厦门3天2晚 | 入住厦门温特雅酒店 + 联合航空/首都航空往返机票厦门温特雅酒店 舒适型 3.9分/5分标准房(大床)(预付) 大床 不含早 1间2晚联合航空 KN5927直飞16:55-19:45首都航空 JD5376直飞22:15-01:15
1北京厦门2030492北京-厦门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北京厦门1866492北京-厦门3天2晚 | 入住厦门温特雅酒店 + 联合航空/首都航空往返机票厦门温特雅酒店 舒适型 3.9分/5分标准房(大床)(预付) 大床 不含早 1间2晚联合航空 KN5927直飞16:55-19:45首都航空 JD5376直飞22:15-01:15
1北京厦门2030492北京-厦门3天2晚 | 入住厦门华美达长升大酒店 + 联合航空/首都航空往返机票厦门华美达长升大酒店 4.1分/5分标准房(错峰出游) 大/双床 双早 1间2晚联合航空 KN5927直飞16:55-19:45首都航空 JD5376直飞22:15-01:15
df_free.info()
<class 'pandas.core.frame.DataFrame'>
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.35444.39
1上海丽江1981.49569.38
2上海乌鲁木齐3223.76711.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北京厦门1866492北京-厦门3天2晚 | 入住厦门温特雅酒店 + 联合航空/首都航空往返机票厦门温特雅酒店 舒适型 3.9分/5分标准房(大床)(预付) 大床 不含早 1间2晚联合航空 KN5927直飞16:55-19:45首都航空 JD5376直飞22:15-01:15
1北京厦门2030492北京-厦门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.3500444.390
1上海丽江1981.4900569.380
2上海乌鲁木齐3223.7600711.800
3上海九寨沟1893.7125492.425
4上海北京1317.0900344.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.3500397
丽江1981.49001159
乌鲁木齐3223.7600136
九寨沟1893.7125168
北京1317.09001444
df4.head()
价格路线总数
出发地目的地
上海三亚1627.3500397
丽江1981.49001159
乌鲁木齐3223.7600136
九寨沟1893.7125168
北京1317.09001444
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.3500397
1上海丽江1981.49001159
2上海乌鲁木齐3223.7600136
3上海九寨沟1893.7125168
4上海北京1317.09001444
df5.shape
(247, 4)

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

df_free.head(2)
出发地目的地价格节省路线名酒店房间去程航司去程方式去程时间回程航司回程方式回程时间
0北京厦门1866492北京-厦门3天2晚 | 入住厦门温特雅酒店 + 联合航空/首都航空往返机票厦门温特雅酒店 舒适型 3.9分/5分标准房(大床)(预付) 大床 不含早 1间2晚联合航空 KN5927直飞16:55-19:45首都航空 JD5376直飞22:15-01:15
1北京厦门2030492北京-厦门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.35NaNNaN1981.493223.761893.7125NaN1317.09NaNNaN...1381.83NaN1641.17NaNNaN1147.92NaN886.321290.33NaN
北京2760.40NaNNaN1958.162362.061953.7400NaNNaNNaNNaN...1283.86NaNNaN1025.14NaN1300.92NaN1016.96NaNNaN

2 rows × 52 columns

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

dff = df_free[df_free['出发地']=='杭州']
dff.head(3)
出发地目的地价格节省路线名酒店房间去程航司去程方式去程时间回程航司回程方式回程时间
8760杭州厦门1172326杭州-厦门3天2晚 | 入住厦门温特雅酒店 + 山东航空往返机票厦门温特雅酒店 舒适型 3.9分/5分标准房(大床)(预付) 大床 不含早 1间2晚山东航空 SC1174直飞22:10-23:45山东航空 SC8837直飞06:50-08:20
8761杭州厦门1336326杭州-厦门3天2晚 | 入住厦门华美达长升大酒店 + 山东航空往返机票厦门华美达长升大酒店 4.1分/5分标准房(错峰出游) 大/双床 双早 1间2晚山东航空 SC1174直飞22:10-23:45山东航空 SC8837直飞06:50-08:20
8762杭州厦门1445367杭州-厦门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.35NaN
丽江NaN2918.320000
九寨沟NaN1952.700000
北海NaN2910.000000
厦门1208.38NaN
呼和浩特NaN1557.570000
哈尔滨NaN1690.990000
大连1710.09NaN
天子山1682.03NaN
天津1506.03NaN
张家界1682.03NaN
成都NaN1898.811111
桂林1438.98NaN
武汉1190.16NaN
沈阳1948.03NaN
西双版纳NaN1716.310000
西宁NaN2851.820000
西安1242.89NaN
重庆1644.17NaN
长沙1160.92NaN
青岛1049.23NaN

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

data = pd.read_csv('data/1.data清洗/hz_weather.csv')
data.head()
日期最高气温最低气温天气风向风力
02017-01-01177西北风2级
12017-01-02168多云东北风2级
22017-01-03158多云东北风1级
32017-01-041511小雨西北风2级
42017-01-051311小到中雨北风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.000000NaN18.511.000000NaNNaNNaN
多云14.11111113.7515.013.33333324.33333321.018.666667
小到中雨NaNNaNNaN13.000000NaNNaNNaN
小雨13.50000011.0014.59.250000NaN14.013.000000
10.25000015.8018.018.00000019.00000018.027.500000
13.50000016.0013.015.60000014.00000011.0NaN
阵雨NaN21.0026.015.33333328.00000012.027.500000
雨夹雪NaNNaNNaN7.000000NaNNaNNaN
# 缺失值的比例
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.00000015.5118.511.00000021.33333315.221.666667
多云14.11111113.7515.013.33333324.33333321.018.666667
小到中雨12.47222215.5117.513.00000021.33333315.221.666667
小雨13.50000011.0014.59.25000021.33333314.013.000000
10.25000015.8018.018.00000019.00000018.027.500000
13.50000016.0013.015.60000014.00000011.021.666667
阵雨12.47222221.0026.015.33333328.00000012.027.500000
雨夹雪12.47222215.5117.57.00000021.33333315.221.666667

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

data2.dropna() 
# 默认删除含有缺失值的行
最高气温
风向东北风东南风东风北风南风西北风西南风
天气
多云14.11111113.7515.013.33333324.33333321.018.666667
10.25000015.8018.018.00000019.00000018.027.500000
data2.dropna(axis=1,how='all')
最高气温
风向东北风东南风东风北风南风西北风西南风
天气
中雨11.000000NaN18.511.000000NaNNaNNaN
多云14.11111113.7515.013.33333324.33333321.018.666667
小到中雨NaNNaNNaN13.000000NaNNaNNaN
小雨13.50000011.0014.59.250000NaN14.013.000000
10.25000015.8018.018.00000019.00000018.027.500000
13.50000016.0013.015.60000014.00000011.0NaN
阵雨NaN21.0026.015.33333328.00000012.027.500000
雨夹雪NaNNaNNaN7.000000NaNNaNNaN

缺失值的填充

# 1、使用字符串来填充
data2.fillna('missing')
最高气温
风向东北风东南风东风北风南风西北风西南风
天气
中雨11missing18.511.000000missingmissingmissing
多云14.111113.751513.33333324.33332118.6667
小到中雨missingmissingmissing13.000000missingmissingmissing
小雨13.51114.59.250000missing1413
10.2515.81818.000000191827.5
13.5161315.6000001411missing
阵雨missing212615.333333281227.5
雨夹雪missingmissingmissing7.000000missingmissingmissing
# 2、使用前一个数据来代替缺失值
data2.fillna(method='pad',limit=1)
最高气温
风向东北风东南风东风北风南风西北风西南风
天气
中雨11.000000NaN18.511.000000NaNNaNNaN
多云14.11111113.7515.013.33333324.33333321.018.666667
小到中雨14.11111113.7515.013.00000024.33333321.018.666667
小雨13.50000011.0014.59.250000NaN14.013.000000
10.25000015.8018.018.00000019.00000018.027.500000
13.50000016.0013.015.60000014.00000011.027.500000
阵雨13.50000021.0026.015.33333328.00000012.027.500000
雨夹雪NaN21.0026.07.00000028.00000012.027.500000
# 使用后一个值来填充bfill
data2.bfill()
最高气温
风向东北风东南风东风北风南风西北风西南风
天气
中雨11.00000013.7518.511.00000024.33333321.018.666667
多云14.11111113.7515.013.33333324.33333321.018.666667
小到中雨13.50000011.0014.513.00000019.00000014.013.000000
小雨13.50000011.0014.59.25000019.00000014.013.000000
10.25000015.8018.018.00000019.00000018.027.500000
13.50000016.0013.015.60000014.00000011.027.500000
阵雨NaN21.0026.015.33333328.00000012.027.500000
雨夹雪NaNNaNNaN7.000000NaNNaNNaN
# 均值填充
data2.fillna(data2.mean())  #最常用
最高气温
风向东北风东南风东风北风南风西北风西南风
天气
中雨11.00000015.5118.511.00000021.33333315.221.666667
多云14.11111113.7515.013.33333324.33333321.018.666667
小到中雨12.47222215.5117.513.00000021.33333315.221.666667
小雨13.50000011.0014.59.25000021.33333314.013.000000
10.25000015.8018.018.00000019.00000018.027.500000
13.50000016.0013.015.60000014.00000011.021.666667
阵雨12.47222221.0026.015.33333328.00000012.027.500000
雨夹雪12.47222215.5117.57.00000021.33333315.221.666667

异常值的处理

# 定义x>3标准差或<-3标准差
data = pd.read_csv('data/1.data清洗/hz_weather.csv')
data
日期最高气温最低气温天气风向风力
02017-01-01177西北风2级
12017-01-02168多云东北风2级
22017-01-03158多云东北风1级
32017-01-041511小雨西北风2级
42017-01-051311小到中雨北风2级
.....................
1132017-04-261913阵雨北风5级
1142017-04-272111多云西北风2级
1152017-04-282613西南风2级
1162017-04-292915西南风3级
1172017-04-302916多云东风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()
日期最高气温最低气温天气风向风力
02017-01-01177西北风2级
12017-01-02168多云东北风2级
22017-01-03158多云东北风1级
32017-01-041511小雨西北风2级
42017-01-051311小到中雨北风2级
data.info()
<class 'pandas.core.frame.DataFrame'>
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()
日期最高气温最低气温天气风向风力异常值
02017-01-01177西北风2级False
12017-01-02168多云东北风2级False
22017-01-03158多云东北风1级False
32017-01-041511小雨西北风2级False
42017-01-051311小到中雨北风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()
日期最高气温最低气温天气风向风力异常值是否异常
02017-01-01177西北风2级FalseFalse
12017-01-02168多云东北风2级FalseFalse
22017-01-03158多云东北风1级FalseFalse
32017-01-041511小雨西北风2级FalseFalse
42017-01-051311小到中雨北风2级FalseFalse
data[data['是否异常']==True]
日期最高气温最低气温天气风向风力异常值是否异常
1022017-04-153117多云南风3级TrueTrue
1032017-04-163021阵雨西南风4级TrueTrue
1052017-04-182916北风3级TrueTrue
1162017-04-292915西南风3级TrueTrue
1172017-04-302916多云东风2级TrueTrue

重复值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杨璐1311431444181
2韩林霖1271391424083
3沙龙逸1231481364074
4李鉴学1261351404015
7韩雨萌1291331384006
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
日期最高气温最低气温天气风向风力
02017-01-01177西北风2级
12017-01-02168多云东北风2级
22017-01-03158多云东北风1级
42017-01-051311小到中雨北风2级
52017-01-061210小雨东北风1级
62017-01-07119中雨北风2级
92017-01-1094多云北风1级
102017-01-1185小雨北风1级
112017-01-1274小雨西南风1级
122017-01-13101多云北风1级
192017-01-206-3东北风3级
282017-01-29204多云北风3级
452017-02-15187南风1级
462017-02-16199小雨西南风2级
492017-02-19217多云西南风3级
752017-03-191410小雨东风1级
842017-03-282212多云西南风3级
902017-04-032312多云东风4级
912017-04-042515多云南风4级
922017-04-052616北风4级
932017-04-062718中雨东风4级
1012017-04-142816南风3级
1022017-04-153117多云南风3级
1032017-04-163021阵雨西南风4级
1052017-04-182916北风3级
1102017-04-232412东风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()
RankCityStatePopulationDate of census/estimate
01London[2]United Kingdom8,615,2461 June 2014
12BerlinGermany3,437,91631 May 2014
23MadridSpain3,165,2351 January 2014
34RomeItaly2,872,08630 September 2014
45ParisFrance2,273,3051 January 2013
df_pop.shape
(105, 5)
df_pop.info()
<class 'pandas.core.frame.DataFrame'>
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()
<class 'pandas.core.frame.DataFrame'>
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()
RankCityStatePopulationDate of census/estimatePop
01London[2]United Kingdom8,615,2461 June 20148615246
12BerlinGermany3,437,91631 May 20143437916
23MadridSpain3,165,2351 January 20143165235
34RomeItaly2,872,08630 September 20142872086
45ParisFrance2,273,3051 January 20132273305
df_pop.info()
<class 'pandas.core.frame.DataFrame'>
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()
RankCityStatePopulationDate of census/estimatePopsubtr
01London[2]United Kingdom8,615,2461 June 201486152468615246
12BerlinGermany3,437,91631 May 201434379163437916
23MadridSpain3,165,2351 January 201431652353165235
34RomeItaly2,872,08630 September 201428720862872086
45ParisFrance2,273,3051 January 201322733052273305

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
titlelink
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
04221
14212
24202
34191
# 提取一个数字及其之后的所有内容
df1['link'].str.extract('(\d.*)',expand=True )
0
04221/
14212/
24202/
34191/
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
04221
14212
24202
34191
df1['link'].str.extract('//(.+)/',expand=True  ) # 贪婪
0
0cntour.cn/news/4221
1cntour.cn/news/4212
2cntour.cn/news/4202
3cntour.cn/news/4191
df1['link'].str.extract('//(.*)/',expand=True ) # 贪婪
0
0cntour.cn/news/4221
1cntour.cn/news/4212
2cntour.cn/news/4202
3cntour.cn/news/4191
df1['link'].str.extract('//(.+?)/',expand=True ) 
# 非贪婪,?是阻止贪婪模式
0
0cntour.cn
1cntour.cn
2cntour.cn
3cntour.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
0cntour
1cntour
2cntour
3cntour
df1['link'].str.extract('//(.+)\.',expand=True )
#\ 就是转义,\.表示将.变为它本来的意义
0
0cntour
1cntour
2cntour
3cntour
df1['link'].str.extract('n/(.+?)/')
0
0news
1news
2news
3news

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

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()
<class 'pandas.core.frame.DataFrame'>
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高档型18885
1杭州丽江机酒自由行\n丽江6日自由行,入住丽江添富太和休闲度假酒店+接送机,品古城文化,享至尊服务,...4.4分\n高档型4.4高档型18726
2杭州丽江机酒自由行\n丽江+香格里拉 丽江+香格里拉6日自由行,机票+特色客栈,丽江往返+接机\n特...4.4分\n经济型4.4经济型15176
3杭州丽江机酒自由行\n丽江+大理 丽江、大理双城6天自由行,3晚丽江特色客栈,2晚大理洱海边客栈,赠...4.4分\n经济型4.4经济型16126
4杭州丽江机酒自由行\n丽江5日自由行,入住丽江听心祥和院+接送机\n5天4晚|天天出发|飞机|舒适游...4.7分\n高档型4.7高档型17405
df.info()
<class 'pandas.core.frame.DataFrame'>
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()
<class 'pandas.core.frame.DataFrame'>
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.05
1杭州丽江机酒自由行\n丽江6日自由行,入住丽江添富太和休闲度假酒店+接送机,品古城文化,享至尊服务,...4.4分\n高档型4.4高档型1872.06
2杭州丽江机酒自由行\n丽江+香格里拉 丽江+香格里拉6日自由行,机票+特色客栈,丽江往返+接机\n特...4.4分\n经济型4.4经济型1517.06
3杭州丽江机酒自由行\n丽江+大理 丽江、大理双城6天自由行,3晚丽江特色客栈,2晚大理洱海边客栈,赠...4.4分\n经济型4.4经济型1612.06
4杭州丽江机酒自由行\n丽江5日自由行,入住丽江听心祥和院+接送机\n5天4晚|天天出发|飞机|舒适游...4.7分\n高档型4.7高档型1740.05
...........................
115杭州丽江自由行\n丽江+大理+香格里拉 双飞丽江<丽江+香格里拉+大理7天自由行>赠表演+接送机+专...4.9分\n舒适型4.9舒适型2610.07
116杭州丽江自由行\n双飞云南!全程自由行+昆明大理丽江6天5晚+N日自由行+特色客栈+接送机\n多商圈...4.9分\n其他4.9其他3020.06
117杭州丽江自由行\n丽江+大理+香格里拉 直飞丽江9天自由行(含往返机票+20KM专用车+接送机+特色...4.9分\n舒适型4.9舒适型3418.09
118杭州丽江自由行\n直飞丽江5天4晚自由行+N天自由行+特色客栈+接送机服务+20公里免费用车\n新城...4.1分\n高档型4.1高档型2110.05
119杭州丽江自由行\n昆明+大理+丽江 双廊精选双飞昆明大理丽江自由行3+N天随意搭配+旅游达人推荐吃喝...4.1分\n高档型4.1高档型2199.06

119 rows × 8 columns

#方法二:
df[df['天数'].notnull()][80:90]
出发地目的地路线信息酒店信息酒店评分酒店等级价格天数
80杭州丽江自由行\n丽江+香格里拉 逼格旅行丨双飞丽江+香格里拉5日游丨宿精品客栈丨含接送机+旅途用车...4.5分\n其他4.5其他2340.05
81杭州丽江自由行\n丽江+大理 遇见纯玩错峰游 大理丽江6天5晚奢旅自由行,杭州直飞丽江往返机票含税。...4.1分\n舒适型4.1舒适型3580.06
82杭州丽江自由行\n丽江+大理+香格里拉 云南私家团大理+丽江+香格里拉7日6晚杨丽萍艺术酒店悦榕庄洲...4.7分\n豪华型4.7豪华型11080.07
83杭州丽江自由行\n丽江+大理+香格里拉 直飞丽江纯玩定制5天4晚半自由行包含接送机+精选古城客栈+赠...3.5分\n舒适型3.5舒适型2690.05
84杭州丽江自由行\n丽江+大理+香格里拉 直飞丽江 纯玩 精选TOP古城客栈(可现选)可赠送 三选一套...4.9分\n其他4.9其他2630.06
85杭州丽江自由行\n0限制直飞昆明全程自由行+N日自由行+舒适客栈5天4晚游;赠送拉市海丽水金沙\n多...4.9分\n其他4.9其他2160.05
86杭州丽江自由行\n丽江+大理+香格里拉 <飞机往返丽江> 丽江+大理+香格里拉4天自由行+管家式服务...4.9分\n其他4.9其他2380.04
87杭州丽江自由行\n丽江+香格里拉 双飞丽江<丽江+香格里拉+泸沽湖7天自由行>赠表演+接送机+专车使...4.9分\n舒适型4.9舒适型2670.07
89杭州丽江自由行\n丽江+大理+香格里拉 直飞丽江 定制纯玩自由行(特色客栈+香格里拉+泸沽湖+大理多...4.9分\n其他4.9其他2740.06
90杭州丽江自由行\n丽江+香格里拉 <双飞往返丽江+香格里拉5天自由行>赠丽水金沙+接送机+专车使用(...4.9分\n舒适型4.9舒适型2370.05
# 将酒店评分转换成浮点数
df['酒店评分']=df['酒店评分'].apply(lambda x: float(x))
# df['天数'].apply(lambda x: int(x)) 说明天数里面有空值
df.info()
<class 'pandas.core.frame.DataFrame'>
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()
<class 'pandas.core.frame.DataFrame'>
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()
<class 'pandas.core.frame.DataFrame'>
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()
<class 'pandas.core.frame.DataFrame'>
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.05
1杭州丽江机酒自由行\n丽江6日自由行,入住丽江添富太和休闲度假酒店+接送机,品古城文化,享至尊服务,...4.4分\n高档型4.4高档型1872.06
2杭州丽江机酒自由行\n丽江+香格里拉 丽江+香格里拉6日自由行,机票+特色客栈,丽江往返+接机\n特...4.4分\n经济型4.4经济型1517.06
3杭州丽江机酒自由行\n丽江+大理 丽江、大理双城6天自由行,3晚丽江特色客栈,2晚大理洱海边客栈,赠...4.4分\n经济型4.4经济型1612.06
4杭州丽江机酒自由行\n丽江5日自由行,入住丽江听心祥和院+接送机\n5天4晚|天天出发|飞机|舒适游...4.7分\n高档型4.7高档型1740.05
# 处理酒店等级字段
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()
<class 'pandas.core.frame.DataFrame'>
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.431888.05
1杭州丽江机酒自由行\n丽江6日自由行,入住丽江添富太和休闲度假酒店+接送机,品古城文化,享至尊服务,...4.4分\n高档型4.431872.06
2杭州丽江机酒自由行\n丽江+香格里拉 丽江+香格里拉6日自由行,机票+特色客栈,丽江往返+接机\n特...4.4分\n经济型4.411517.06
3杭州丽江机酒自由行\n丽江+大理 丽江、大理双城6天自由行,3晚丽江特色客栈,2晚大理洱海边客栈,赠...4.4分\n经济型4.411612.06
4杭州丽江机酒自由行\n丽江5日自由行,入住丽江听心祥和院+接送机\n5天4晚|天天出发|飞机|舒适游...4.7分\n高档型4.731740.05

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

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
# 生成时间序列
<function pandas.core.indexes.datetimes.date_range(start=None, end=None, periods=None, freq=None, tz=None, normalize=False, name=None, closed=None, **kwargs) -> 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()
日期最高气温最低气温天气风向风力
02017-01-01177西北风2级
12017-01-02168多云东北风2级
22017-01-03158多云东北风1级
32017-01-041511小雨西北风2级
42017-01-051311小到中雨北风2级
df=data[['日期','最高气温','最低气温']]
df.head()
日期最高气温最低气温
02017-01-01177
12017-01-02168
22017-01-03158
32017-01-041511
42017-01-051311
df.info()
<class 'pandas.core.frame.DataFrame'>
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()
<class 'pandas.core.frame.DataFrame'>
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()
<class 'pandas.core.frame.DataFrame'>
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-01177
2017-01-02168
2017-01-03158
2017-01-041511
2017-01-051311
2017-01-061210
2017-01-07119
2017-01-08125
2017-01-09114
2017-01-1094
2017-01-1185
2017-01-1274
2017-01-13101
2017-01-14102
2017-01-1582
2017-01-1692
2017-01-17117
2017-01-1886
2017-01-1980
2017-01-206-3
2017-01-217-1
2017-01-228-2
2017-01-238-1
2017-01-2493
2017-01-25102
2017-01-26133
2017-01-27135
2017-01-28177
2017-01-29204
2017-01-3080
2017-01-3183
# 转换成月份
df.to_period('M').head()
最高气温最低气温
日期
2017-01177
2017-01168
2017-01158
2017-011511
2017-011311
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值