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