import numpy as np
import pandas as pd
from pandas import Series,DataFrame
import matplotlib.pyplot as plt
%matplotlib inline
datas={'name':['张a亦','张亦','李尔','李尔','赵兆','龚珍c','熊时','王武','王一','王二','李四','赵武','孙泉'],
'phone':['133********']*13,
'date':pd.date_range('20150109',periods=13,freq='D'),
'city':['广州']*4+['东莞']+['深圳']*2+['惠州']*2+['东莞']+['广州']*3}
df=DataFrame(datas)
df
'''测试'''
pd.date_range('20150109',periods=13,freq='D')
Out:
DatetimeIndex(['2015-01-09', '2015-01-10', '2015-01-11', '2015-01-12',
'2015-01-13', '2015-01-14', '2015-01-15', '2015-01-16',
'2015-01-17', '2015-01-18', '2015-01-19', '2015-01-20',
'2015-01-21'],
dtype='datetime64[ns]', freq='D')
# 更换列顺序
df1=df[['name','phone','date','city']]
df1
df1.describe()
# 查看数据格式,看到data是时间格式可以使用strftime("%Y-%m-%d")
df1.dtypes
Out:
df1.dtypes
name object
phone object
date datetime64[ns]
city object
dtype: object
# 时间的转换格式:x.strftime("%Y-%m-%d")
time1=df1.date.map(lambda x: x.strftime('%Y%m%d'))
time1
Out:
0 20150109
1 20150110
2 20150111
3 20150112
4 20150113
5 20150114
6 20150115
7 20150116
8 20150117
9 20150118
10 20150119
11 20150120
12 20150121
df1.date=time1
df1.dtypes
Out:
name object
phone object
date object
city object
dtype: object
# 查看date是字符串类型
df1.dtypes
Out:
name object
phone object
date object
city object
dtype: object
# string类转化格式只需要改变字符串拼接即可
time_zhuan=df1.date.map(lambda x: x[0:4]+x[4:6])
time_zhuan
Out:
0 201501
1 201501
2 201501
3 201501
4 201501
5 201501
6 201501
7 201501
8 201501
9 201501
10 201501
11 201501
12 201501
Name: date, dtype: object
# string类转化格式,使用pd.to_datetime(df1.date)转化成时间格式即可为xxxx-xx-xx
data_time=pd.to_datetime(df1.date)
data_time
Out:
0 2015-01-09
1 2015-01-10
2 2015-01-11
3 2015-01-12
4 2015-01-13
5 2015-01-14
6 2015-01-15
7 2015-01-16
8 2015-01-17
9 2015-01-18
10 2015-01-19
11 2015-01-20
12 2015-01-21
Name: date, dtype: datetime64[ns]
# 将转化好的时间类型赋值至表格中
df1.date=time_zhuan
df1.dtypes
Out:
name object
phone object
date object
city object
dtype: object
df1['date'][2]='201510'
df1['date'][5]='201509'
df1['date'][10]='201510'
df1['date'][3]='201502'
df1['date'][6]='201511'
df1['date'][0]='201506'
df1['date'][1]='201508'
# 遍历date数据,截取月份部分,使用聚合max()求出最大值
month=(df1.date.map(lambda x : x[4:])).max()
# month.max()
month
(df1.city=='广州').sum()/df1.city.size
Out:
0.5384615384615384
导包
import re
查看
df1.name
Out:
0 张a亦
1 张亦
2 李尔
3 李尔
4 赵兆
5 龚珍c
6 熊时
7 王武
8 王一
9 王二
10 李四
11 赵武
12 孙泉
Name: name, dtype: object
测试filter
# 筛选出含有A-z的字符的名字(测试filter用)
list(filter(lambda x:re.findall('[A-Za-z]',x),df1.name))
Out:
['张a亦', '龚珍c']
使用 正则: re.sub('过滤规则','要替换成的规则',str)
# 使用 正则的 re.sub('过滤规则','要替换成的规则',str)
new_name=df1.name.map(lambda x: re.sub('[A-Za-z]','',x))
new_name
Out:
0 张亦
1 张亦
2 李尔
3 李尔
4 赵兆
5 龚珍
6 熊时
7 王武
8 王一
9 王二
10 李四
11 赵武
12 孙泉
Name: name, dtype: object
# 将变换的数据替换至表格中
df1.name=new_name
df1
A=df1.copy()
A
查看
df1.name
Out:
0 张亦
1 张亦
2 李尔
3 李尔
4 赵兆
5 龚珍
6 熊时
7 王武
8 王一
9 王二
10 李四
11 赵武
12 孙泉
Name: name, dtype: object
筛选
# 筛选出 “李” 姓氏的客户
li_list=list(filter(lambda x:re.findall('李.*',x),df1.name ))
li_list
['李尔', '李尔', '李四']
'''将名字列设置为列索引'''
df1.set_index(df1.name,inplace=True)
df1.index
Out:
Index(['张亦', '张亦', '李尔', '李尔', '赵兆', '龚珍', '熊时', '王武', '王一', '王二', '李四', '赵武',
'孙泉'],
dtype='object', name='name')
# 将名字列删除
df1.drop('name',axis=1,inplace=True)
# 过滤掉重复的名字
li_Seri=pd.Series(li_list).unique()
li_Seri
Out:
array(['李尔', '李四'], dtype=object)
筛选后的数据存入表B
# 使用筛选出的过滤后的名字来筛选整个字段的信息
B=df1.loc[li_Seri]
B
data2={'name':['张亦','李尔','赵兆','龚珍','熊时','王武','王一','王二','李四','赵武','孙泉'],
'age':[30,26,'.',70,20,19,45,'.',47,32,50],}
Tb2=DataFrame(data2)
Tb2
Tb2=Tb2[['name','age']]
Tb2
合并数据集A
C=pd.merge(A,Tb2)
C
C_1=C.copy()
C_1
给数据集排序sort_values(ascending=False:按降序排序,即日期小的排在后面)
C_1=C_1.sort_values(by='date',ascending=False)
C_1
# 保留后一项,删除前一项重复数据
C_1.duplicated('name', keep='last')
Out:
6 False
2 True
10 False
5 False
1 True
0 False
3 False
4 False
7 False
8 False
9 False
11 False
12 False
dtype: bool
# 保留第一项,删除后一项重复数据
C_1.duplicated('name', keep='first')
Out:
6 False
2 False
10 False
5 False
1 False
0 True
3 True
4 False
7 False
8 False
9 False
11 False
12 False
dtype: bool
C_1.drop_duplicates('name', keep='first',inplace=True)
C_1
# 统一转化为string类型
C_1.age=C_1.age.apply(str)
C_1.age
OUt:
6 20
2 26
10 47
1 30
5 70
4 .
7 19
8 45
9 .
11 32
12 50
Name: age, dtype: object
max(C_1.age)
Out: '70'
from functools import reduce
# 如果列中没有缺失值,可以使用该方法累加
reduce(lambda a,b:int(a)+int(b),C_1.age)
reduce(lambda a,b:int(a)+int(b),np.array([1,2,4]))
Out:7
sum=0
for i in C_1.age:
if i !='.':
# print(i)
sum+=int(i)
print(sum/C_1.age.size)
Out:
30.818181818181817
# 显示2位小数
a=30.818181818181817
print('%.2f'%a)
Out : 30.82
① 使用 replace
C_1.age.replace(to_replace='.',value=np.nan,inplace=True)
C_1
② 使用 map
C_1.age=C_1.age.map(lambda x: np.nan if x =='.' else x)
C_1.age
Out:
6 20
2 26
10 47
1 30
5 70
4 NaN
7 19
8 45
9 NaN
11 32
12 50
Name: age, dtype: object
'''查看是否有缺失值,有则为True'''
C_1.age.isnull().any()
Out: True
# 统计数量
C_1.age.isnull().sum()
Out:2
填充缺失值 or 删除缺失值
'''参数:value=None, method=None, axis=None, inplace=False, limit=None'''
C_1.age.fillna(value=0)
Out:
6 20
2 26
10 47
5 70
1 30
4 0
7 19
8 45
9 0
11 32
12 50
Name: age, dtype: object
'''向前填充,参数:axis=None, inplace=False, limit=None, downcast=None'''
C_1.age.bfill()
Out:
6 20
2 26
10 47
5 70
1 30
4 19
7 19
8 45
9 32
11 32
12 50
Name: age, dtype: object
'''向后填充,参数:axis=None, inplace=False, limit=None, downcast=None'''
C_1.age.ffill()
Out:
6 20
2 26
10 47
5 70
1 30
4 30
7 19
8 45
9 45
11 32
12 50
Name: age, dtype: object
'''默认删除行记录,参数:axis=0, inplace=False, **kwargs'''
C_1.age.dropna()
Out:
6 20
2 26
10 47
5 70
1 30
7 19
8 45
11 32
12 50
Name: age, dtype: object