今日进度:数据格式化,数据分组统计
1.数据格式化
1.1设置小数位数
设置小数位数,主要使用DataFrame对象中的round函数,该函数可以实现四舍五入,而它的decimals参数则用于设置保留小数的位数,设置后的数据类型不会发生变化,依然是浮点型
DataFrame.round(decimals=0, *arg, **kwargs)
decimals:每一列四舍五入的小数位数,整型,字典或Series对象。如果是整数,则将每一列四舍五入到相同的位置;否则,将dic和Series舍入到可变数目的位置。如果小数是类似于字典的,那么列名应该在键中;如果小数是级数,列名应该在索引中。没有包含在小数中的任何列都将保持原样,非输入列的小数元素将被忽略。
import pandas as pd
import numpy as np
df = pd.DataFrame(np.random.random([5, 5]),
columns=['A1', 'A2', 'A3', 'A4', 'A5'])
print(df)
print(df.round(2)) #保留小数点后两位
print(df.round({'A1':1, 'A2':2})) #A1保留小数点的后一位、A2保留小数点后两位
s1 = pd.Series([1, 0, 2], index=['A1', 'A2', 'A3'])
print(df.round(s1)) #设置Series对象的小数位数
输出结果
A1 A2 A3 A4 A5
0 0.982675 0.915655 0.383080 0.743219 0.930802
1 0.110738 0.824724 0.413849 0.619962 0.579390
2 0.589983 0.360215 0.442702 0.873653 0.762054
3 0.523321 0.629663 0.175422 0.993261 0.369487
4 0.895804 0.037372 0.511144 0.831248 0.925663
A1 A2 A3 A4 A5
0 0.98 0.92 0.38 0.74 0.93
1 0.11 0.82 0.41 0.62 0.58
2 0.59 0.36 0.44 0.87 0.76
3 0.52 0.63 0.18 0.99 0.37
4 0.90 0.04 0.51 0.83 0.93
A1 A2 A3 A4 A5
0 1.0 0.92 0.383080 0.743219 0.930802
1 0.1 0.82 0.413849 0.619962 0.579390
2 0.6 0.36 0.442702 0.873653 0.762054
3 0.5 0.63 0.175422 0.993261 0.369487
4 0.9 0.04 0.511144 0.831248 0.925663
A1 A2 A3 A4 A5
0 1.0 1.0 0.38 0.743219 0.930802
1 0.1 1.0 0.41 0.619962 0.579390
2 0.6 0.0 0.44 0.873653 0.762054
3 0.5 1.0 0.18 0.993261 0.369487
4 0.9 0.0 0.51 0.831248 0.925663
当然,保留小数位数也可以用自定义函数,例如,将DataFrame对象中的各个浮点值保留两位小数,关键代码如下:
df.applymap(lambda x: '%.2f'%x)
注意,经过自定义函数处理后的数据将不再是浮点型而是对象型,如果后续计算则首先应该将数据类型进行转换。
1.2设置百分比
主要使用apply函数和format函数
import pandas as pd
import numpy as np
df = pd.DataFrame(np.random.random([5, 5]),
columns=['A1', 'A2', 'A3', 'A4', 'A5'])
df['百分比']=df['A1'].apply(lambda x: format(x, '.0%')) #整列保留0位小数
df['百分比']=df['A1'].apply(lambda x: format(x, '.2%')) #整列保留两位小数
df['百分比']=df['A1'].map(lambda x:'{:.0%}'.format(x)) #使用map函数整列保留0位小数
1.3设置千位分隔符
import pandas as pd
pd.set_option('display.unicode.east_asian_width', True)
data = [['高等数学', '1月', 12342521], ['高等数学', '2月', 23123141], ['高等数学', '3月', '45643212']]
columns = ['图书', '月份', '金额']
df = pd.DataFrame(data=data, columns=columns)
df['金额'] = df['金额'].apply(lambda x:format(int(x),','))
print(df)
结果
图书 月份 金额
0 高等数学 1月 12,342,521
1 高等数学 2月 23,123,141
2 高等数学 3月 45,643,212
注意:设置千位分割符后,对于程序来说,这些数据将不再是数值型,而是数字和逗号组成的字符串,如果由于程序需要再变成数值型会很麻烦,因此设置千位分隔符要慎重