python——类型转换和冗余数据删除

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,则会用删除后的数据替换原始数据

你可能感兴趣的:(Python)