#导包 import pandas as pd import numpy as np import random # 读取pandas120数据文件 df = pd.read_excel('/home/mw/input/pandas1206855/pandas120.xlsx') df.head() # 构建nan数据 df['value'] = [random.randint(1,100) for i in range(len(df))] df.loc[[2,10,45,87], 'value'] = np.nan
createTime |
education | salary | |
0 | 2020-03-16 11:30:18 | 本科 | 20k-35k |
1 | 2020-03-16 10:58:48 | 本科 | 20k-40k |
2 | 2020-03-16 10:46:39 | 不限 | 20k-35k |
3 | 2020-03-16 10:45:44 | 本科 | 13k-20k |
4 | 2020-03-16 10:20:41 | 本科 | 10k-20k |
1. 判断缺失值
# 检查数据中是否含有任何缺失值: df.isnull().values.any() # 输出True # 查看每列数据缺失值: df.isnull().sum() #####输出######### createTime 0 education 0 salary 0 value 4 dtype: int64 ################### # 查看每列非缺失值数: df.notnull().sum() df.shape[0] - df.isnull().sum() #####输出######### createTime 135 education 135 salary 135 value 131 dtype: int64 ###################
2. 缺失值填充
# 用上下平均值填充value列: df['value'] = df['value'].fillna(df['value'].interpolate()) df.head() # df (注意赋值,如果不赋值,原始序列未改变) # 将value列缺失值全部替换为1.0: df.fillna(value =1.0, inplace = True)
createTime |
education | salary | value | |
0 | 2020-03-16 11:30:18 | 本科 | 20k-35k | 38.0 |
1 | 2020-03-16 10:58:48 | 本科 | 20k-40k | 9.0 |
2 | 2020-03-16 10:46:39 | 不限 | 20k-35k | 39.5 |
3 | 2020-03-16 10:45:44 | 本科 | 13k-20k | 70.0 |
4 | 2020-03-16 10:20:41 | 本科 | 10k-20k | 88.0 |
3. 删除缺失值
# 删除所有存在缺失值的行: df.dropna(axis=0, how='any', inplace=True) # 删除所有有缺失值的行 df.dropna() # -- 默认axis=0 # 删除所有有缺失值的列 df.dropna(axis='columns') df.dropna(axis=1) # 删除所有值缺失的行 df.dropna(how='all') # 删除至少有两个非缺失值的行 df.dropna(thresh=2) # 指定判断缺失值的列范围 df.dropna(subset=['education', 'value']) # 使删除和的结果生效 df.dropna(inplace=True) # 指定列的缺失值删除 df.value.dropna()
4.数据排序
# 按照value列值大小进行排序 df.sort_values(by=['value'], ascending=True) #注:ascending:True升序,False降序
5.设置value2列保留两位小数
# 方法一:round()函数 df['value2'].round(2) # 方法二:map + lambda df['value2'].map(lambda x : ('%.2f') % x) # 方法三:map + lambda + format df['value2'] = df['value2'].map(lambda x : format(x, '.2f'))
6.数据合并:concat, merge, append, join
用的时候chatgpt吧 太难记了
join 最简单,主要用于基于索引的横向合并拼接
merge 最常用,主要用于基于指定列的横向合并拼接
concat最强大,可用于横向和纵向合并拼接
append,主要用于纵向追加
7.常见统计函数
print('grade列均值:',df['grade'].mean()) # 均值 print('全体平均数:',df.mean().mean()) # 全体平均数 print('grade列中位数:',df['grade'].median()) # 中位数 print('grade列方差:',df['grade'].var()) # 方差 print('grade列标准差:',df['grade'].std()) # 标准差 print('grade列最大值:',df['grade'].max()) # 最大值 print('grade列最小值:',df['grade'].min()) # 最小值
8.agg()函数
- 聚合函数,对分组后数据进行聚合,默认情况对分组后其他列进行聚合;
df[['grade', 'cycle']].agg([np.sum, np.mean, np.median, np.min, np.max, np.std, np.var])
grade |
cycle | |
sum | 23.00000 | 15.0 |
mean | 4.60000 | 3.0 |
median | 5.00000 | 2.0 |
amin | 2.00000 | 1.0 |
amax | 6.00000 | 6.0 |
std | 1.67332 | 2.0 |
var | 2.80000 | 4.0 |
9.分组计算
- 主要的作用是进行数据的分组以及分组后地组内运算;
例如: 按course列分组后,grade列元素最多的是?
# 方法一:head()取行 df[['course', 'grade']].groupby('course').sum().sort_values(by='grade', ascending=False).head(1)
grade |
|
course | |
Java | 6 |
作业:
import pandas as pd import numpy as np import random # 载入数据 data = pd.read_excel('/home/mw/input/pandas1206855/pandas120.xlsx') # 将salary列数据转换为最大值与最小值的平均值 df = data.copy() df['salary'] = df['salary'].map(lambda x: [int(x[0:-1]) for x in x.split('-')]) df['salary'] = df['salary'].map(lambda x: ((x[0] + x[1])*1000) / 2) df['salary'] = df['salary'].astype('int') # 计算salary列最大最小值之差(极差),设置列名为ptp df['ptp'] = df['salary'].max() - df['salary'].min() # 新增一列根据salary列数值大小划分为三个层次['低', '中', '高'],列名命名category df['salary'] = df['salary'].astype('int') df['category'] = pd.cut(df['salary'], [0, 5000, 20000, 50000], labels=['低', '中', '高']) # 根据createTime列,拆分两列字段:日期(年-月-日格式)、小时,分别命名date,hour # for i in range(len(df)): # df['date'] = df.iloc[i, 0].to_pydatetime().strftime('%Y-%m-%d %H:%M:%S') df['date'] = df['createTime'].apply(lambda x: str(x.year) + '-0' + str(x.month) + '-' + str(x.day)) df['hour'] = df['createTime'].apply(lambda x: x.hour) # 统计在2020-03-16这一天,每个小时的平均工资、平均极差(每行数据极差都是41500)、本科和硕士学历个数,薪资层次中高中低的个数, # 数据框展示的列分别有date,hour,mean_salary,mean_ptp,count_college,count_master,count_low,count_meddle,count_high; # 并将平均工资保留两位小数,最后按照date,hour升序排序 # mean_salary 平均工资保留两位小数 # 按照date,hour升序排序 # 请注意按照要求输出答案 # 筛选出2020-03-16这一天的数据 dff = df.loc[df['date'].isin(['2020-03-16'])] ## 对education和category进行dummy处理 dff = pd.get_dummies(dff, prefix=['学历', '等级'], columns=['education', 'category']) ## 按照date和hour分组统计,计算各类数据 df2 = dff.groupby(['date', 'hour']).agg({'salary': ['mean'], 'ptp': ['mean'], '学历_本科': ['sum'], '学历_硕士': ['sum'], '等级_低': ['sum'], '等级_中': ['sum'], '等级_高': ['sum']}) df2.reset_index(inplace=True) df2.columns = [[' '.join(col).strip() for col in df2.columns]] df2['ptp mean'] = df2['ptp mean'].astype('int') df2['salary mean'] = df2['salary mean'].round(2) data = pd.concat([df2.iloc[:, 0], df2.iloc[:, 1], df2.iloc[:, 2], df2.iloc[:, 3], df2.iloc[:, 4], df2.iloc[:, 5], df2.iloc[:, 6], df2.iloc[:, 7], df2.iloc[:, 8]]) df3 = pd.DataFrame(data, columns=['answer']) df3['id'] = range(len(df3)) df3 = df3[['id', 'answer']] df3.to_csv('answer_3.csv', index=False, encoding='utf-8-sig')
收获