数据格式化
目录
数值类型格式化
- 设置小数位数
- 设置百分比
- 设置千位分隔符
文本类型格式化
- 一列数据转换为多列数据
- 行列转换
日期类型格式化
- 批量处理日期数据转换(to_datetime())
- 日期判断(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(['序号', '班级'])
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. 获取2018年5月的所有记录
df['2018_05']
4. 获取某一天的记录
df['2021-01-01':'2020-01-01']
|