1.类型转换
import
pandas
as
pd
import
datetime
一般我们拿到日期型数据时,基本都是字符串表示的,该如何将其转换为日期型和日期时间型。
法1:
dt
=
'2019/06/13 16:16:39'
d
=
'2017-04-24'
str2datetime
=
datetime
.
datetime
.
strptime
(
dt
,
'%Y/%m/%d %H:%M:%S'
)
str2date1
=
datetime
.
datetime
.
strptime
(
d
,
'%Y-%m-%d'
)
str2date2
=
datetime
.
datetime
.
strptime
(
d
,
'%Y-%m-%d'
)
.
date
(
)
print
(
str2datetime
)
print
(
str2date1
)
print
(
str2date2
)
2019-06-13 16:16:39
2017-04-24 00:00:00
2017-04-24
法2:
# 字符串转换为时间格式
dt
=
pd
.
DataFrame
(
[
'2019/06/13 16:16:39'
,
'2019-03-02 23:12:23'
,
'2019-03-22 13:12:23'
,
'2019-05-02 15:12:30'
,
'2019-04-02 17:33:23'
,
'20/05/02'
]
)
print
(
dt
)
0
0 2019/06/13 16:16:39
1 2019-03-02 23:12:23
2 2019-03-22 13:12:23
3 2019-05-02 15:12:30
4 2019-04-02 17:33:23
5 20/05/02
dt
.
iloc
[
:
,
0
]
=
pd
.
to_datetime
(
dt
.
iloc
[
:
,
0
]
,
format
=
'%Y-%m-%d'
,
errors
=
'coerce'
)
# 将其他格式显示成NaT
print
(
dt
)
0
0 2019-06-13 16:16:39
1 2019-03-02 23:12:23
2 2019-03-22 13:12:23
3 2019-05-02 15:12:30
4 2019-04-02 17:33:23
5 NaT
salesDf
=
dt
.
dropna
(
how
=
'any'
)
print
(
salesDf
)
0
0 2019-06-13 16:16:39
1 2019-03-02 23:12:23
2 2019-03-22 13:12:23
3 2019-05-02 15:12:30
4 2019-04-02 17:33:23
2.冗余数据删除
1.删除缺失值
dropna() 默认删除含有缺失值的行,参数how = 'all’指删除全部为空值的行
data3
=
pd
.
read_excel
(
io
=
r
'D:\BD\data3.xlsx'
)
data3
.
dtypes
id int64
gender object
age float64
edu object
custom_amt object
order_date object
dtype: object
data3
.
head
(
)
id | gender | age | edu | custom_amt | order_date | |
---|---|---|---|---|---|---|
0 | 890 | female | 43.0 | NaN | ¥2177.94 | 2018年12月25日 |
1 | 2391 | male | 52.0 | NaN | ¥2442.18 | 2017年5月24日 |
2 | 2785 | male | 39.0 | NaN | ¥849.79 | 2018年5月15日 |
3 | 1361 | female | 26.0 | NaN | ¥2482.22 | 2018年5月16日 |
4 | 888 | female | 61.0 | 本科 | ¥2027.9 | 2018年1月21日 |
上述数据中用户id应为字符型,消费金额应为数值型,订单日期应为日期型
# 用户id转换为字符型
data3
[
'id'
]
=
data3
[
'id'
]
.
astype
(
str
)
# 用户消费金额转换为数值型 ,消费金额中包含人民币符号'¥',所以要从第二个元素开始截断
data3
[
'custom_amt'
]
=
data3
[
'custom_amt'
]
.
str
[
1
:
]
.
astype
(
float
)
# 订单日期转换为日期型
data3
[
'order_date'
]
=
pd
.
to_datetime
(
data3
[
'order_date'
]
,
format
=
'%Y年%m月%d日'
)
2.删除重复数据
data3.duplicated().any()
判断数据中是否存在重复观测,如果不加any(),则会返回一个与原数据行数相同的序列,使用了any()方法,则只返回一个值(True或False)
duplicated方法和drop_duplicates方法 都有一个重要的参数,默认情况下不设置该参数时,表示对数据的所有列进行重复性判断,如果需要按照指定的变量做数据的重复性判断时,就可以使用该参数指定具体的变量列表。
# 构造数据
df
=
pd
.
DataFrame
(
dict
(
name
=
[
'张三'
,
'李四'
,
'王二'
,
'张三'
,
'赵五'
,
'丁一'
,
'王二'
]
,
gender
=
[
'男'
,
'男'
,
'女'
,
'男'
,
'女'
,
'女'
,
'男'
]
,
age
=
[
29
,
25
,
27
,
29
,
21
,
22
,
27
]
,
income
=
[
15600
,
14000
,
18500
,
15600
,
10500
,
18000
,
13000
]
,
edu
=
[
'本科'
,
'本科'
,
'硕士'
,
'本科'
,
'大专'
,
'本科'
,
'硕士'
]
)
)
df
name | gender | age | income | edu | |
---|---|---|---|---|---|
0 | 张三 | 男 | 29 | 15600 | 本科 |
1 | 李四 | 男 | 25 | 14000 | 本科 |
2 | 王二 | 女 | 27 | 18500 | 硕士 |
3 | 张三 | 男 | 29 | 15600 | 本科 |
4 | 赵五 | 女 | 21 | 10500 | 大专 |
5 | 丁一 | 女 | 22 | 18000 | 本科 |
6 | 王二 | 男 | 27 | 13000 | 硕士 |
# 默认情况下,对每行所有变量进行判断,删除第二条重复行,删除第二行的张三
df
.
drop_duplicates
(
)
name | gender | age | income | edu | |
---|---|---|---|---|---|
0 | 张三 | 男 | 29 | 15600 | 本科 |
1 | 李四 | 男 | 25 | 14000 | 本科 |
2 | 王二 | 女 | 27 | 18500 | 硕士 |
4 | 赵五 | 女 | 21 | 10500 | 大专 |
5 | 丁一 | 女 | 22 | 18000 | 本科 |
6 | 王二 | 男 | 27 | 13000 | 硕士 |
# 根据用户姓名和年龄来删除重复值
df
.
drop_duplicates
(
subset
=
[
'name'
,
'age'
]
)
name | gender | age | income | edu | |
---|---|---|---|---|---|
0 | 张三 | 男 | 29 | 15600 | 本科 |
1 | 李四 | 男 | 25 | 14000 | 本科 |
2 | 王二 | 女 | 27 | 18500 | 硕士 |
4 | 赵五 | 女 | 21 | 10500 | 大专 |
5 | 丁一 | 女 | 22 | 18000 | 本科 |
使用drop_duplicates方法删除重复数据,并不能直接影响到原始数据,即原始数据中还是存在重复观测的,若使用inplace = True,则会用删除后的数据替换原始数据