Pandas数据格式化

数据格式化

目录

  1. 数值类型格式化

    1. 设置小数位数
    1. 设置百分比
    1. 设置千位分隔符
  2. 文本类型格式化

    1. 一列数据转换为多列数据
    1. 行列转换
  3. 日期类型格式化

    1. 批量处理日期数据转换(to_datetime())
    1. 日期判断(df[‘column’].dt.year())

前期准备

1
2
3
4
5
6
7
8
9
import pandas as pd 
import numpy as np
pd.set_option('display.unicode.east_asian_width',True)

df = pd.read_excel('F:/project2_pandas/Python数据分析从入门到精通/MR/Code/04/47/mingribooks.xls')
df.info()

ft = pd.DataFrame(np.random.random([5,5]), columns = ['A1','A2','A3','A4','A5'])
print(ft)

1. 数值类型格式化

1.1. 设置浮点数小数位数

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
'''
DataFrame.round(decimals=0, *args, **kwargs)
decimals: 保留的小数位数
*args: 附加的关键字参数
**kwargs: 附加的关键字参数
'''

# 所有小数全部设置成为保留小数点后两位
ft11 = ft.round(2)
print(ft11.head(2))
ft11.head(2)

# 也可以使用函数,为所有浮点数保留小数点后两位
ft12 = ft.applymap(lambda x:'%.2f'%x)
print(ft12)

# 对不同列应用不同的小数位保留规则
ft13 = ft.round({'A1':2,'A2':0})
print(ft13.head(2))

1.2. 设置百分比

1
2
3
4
5
6
7
8
9
10
11
12
''' 
使用format()函数,保留n位小数的百分比形式
df['new_column'] = df['column'].apply(lambda x: format(x,'.n%'))
使用map()函数,整列保留n位小数的百分比形式
df['new_column'] = df['column'].map(lambda x : '{.n%}'.format(x))
'''

ft['A1百分比'] = ft['A1'].apply(lambda x: format(x,'.2%'))
print(ft)

ft['A2百分比'] = ft['A2'].map(lambda x: '{:.2%}'.format(x))
print(ft)

1.3. 设置千位分隔符

1
2
3
4
5
6
7
8
9
10
''' 
将数值类型的金额转换为带千位分隔符的字符串
df['column'] = df['column'].apply(lambda x: format(int(x),','))
'''
data = [['1月','199237'],['2月','222222']]
columns = ['月份','销售额']
ff = pd.DataFrame(data=data,columns=columns)
print(ff)
ff['销售额'] = ff['销售额'].apply(lambda x: format(int(x),','))
print(ff)

2. 文本数据格式化

2.1 一列转多列

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
''' 
在实际应用中,我们常常需要将复合的文本拆分,如详细的地址拆分为XX省,XX市等,这需要做的就是一列转多列。

函数名称为:split()

Series.str.split(pat=None, n=-1, expand=False)

pat: 可以是字符串、符号或正则表达式,其作为字符串分割的依据,默认为空格;

n: 整型,默认值是-1,0或者-1都将返回所有拆分;

expand: 分割后的结果是否转换为DataFrame,默认值为False。

返回值:系列、索引、dataframe或多重索引。
'''

sf = pd.read_excel(
'F:/project2_pandas/Python数据分析从入门到精通/MR/Code/04/26/mrbooks.xls',usecols=['买家会员名','收货地址'])

sf.head()

series = sf['收货地址'].str.split(' ',expand = True)

sf['省'] = series[0]
sf['市'] = series[1]
sf['区'] = series[2]

sf.head()

'''
从上面的代码中,我们看到,如果想要将分割后的数据添加到DataFrame中,需要创建新列,重新赋值等。
下面的方法,让我们将生成的结果自动衔接到原表格中
sf=sf.join(sf['column'].str.split())
'''
sjf = pd.read_excel(
'F:/project2_pandas/Python数据分析从入门到精通/MR/Code/04/26/mrbooks.xls', usecols=['买家会员名', '收货地址'])

sjf = sjf.join(sjf['收货地址'].str.split(' ',expand=True))
sjf.head()

2.2. 行列转换

1
2
3
4
5
6
7

# 行转列--针对索引
DataFrame.stack(level=-1, dropna = True)
# 列转行--针对索引
DataFrame.unstack(level=-1, fill_value=None)
# 列转行--针对数值
DataFrame.pivot(index=None, columns=None, values=None)
1
2
3
4
5
# 设置准备条件
ci = pd.read_excel(
'F:/project2_pandas/Python数据分析从入门到精通/MR/Code/04/29/grade.xls')

print(ci.head())

2.2.1. 行转列

1
2
3
4
5
6
ci = ci.set_index(['序号', '班级'])
# 设置2级索引(列表中有几个值,索引为几级)
# 必须将设置结果重新赋予ci,否则白费力气
# 设置好行索引之后,其他所有列都将归为一列
ci1 = ci.stack()
print(ci1.head())

2.2.2. 列转行

1
2
3
4
5
6
7
8
ic = pd.read_excel(
'F:/project2_pandas/Python数据分析从入门到精通/MR/Code/04/30/grade.xls',sheet_name='英语2')
print(ic.head())
## 设置多行索引
ic = ic.set_index(['班级','序号','Unnamed: 2'])
## 确定好索引后,最后一个行索引下面的值将会成为列索引
ic = ic.unstack()
print(ic.head())

2.2.3. 行列转换pivot()

1
2
3
4
5
6
pv = pd.read_excel(
'F:/project2_pandas/Python数据分析从入门到精通/MR/Code/04/30/grade.xls', sheet_name='英语3')
print(pv.head())

pv = pv.pivot(index='序号',columns='班级',values='得分')
print(pv)

3. 日期数据格式化

3.1. 统一日期格式

DataFrame.to_datetime()

该函数还有很多参数可以选择,

但是一般不会用到,

什么时候需要用的时候再去百度就好

3.2. 获取日期属性

1
2
3
4
5
df['星期几'] = df['datetime_columns'].dt.day_name()

df['季度'] = df['datetime_columns'].dt.quarter

df['是否年底'] = df['datetime_column'].dt.is_year_end

3.3. 获取某个日期或者日期范围所记录的所有记录

使用DataFrame可以获取某个时间段内所有记录,但是,前提必须将时间列设置为索引

1
2
3
4
5
6
7
8
9
10
11
12
13
14
1. 获取2018年所有记录
df['2018']

2. 获取2018年和2019年所有记录

df['2018':'2019']

3. 获取20185月的所有记录

df['2018_05']

4. 获取某一天的记录

df['2021-01-01':'2020-01-01']

本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!