pandas的一些使用技巧
这两天用pandas做数据分析时学习到一些技巧,在这里记录下来备以后使用。
目录
1 将从MySQL数据库中查询的结果转换为DataFrame类型
2 使用groupby函数以某一列为键计算另一列的平均值
3 使用lambda表达式执行逐元素操作
4 使用reset_index函数还原索引
5 使用head函数查看DataFrame中的前几条样本
6 使用shape属性查看DataFrame对象的形状
7 使用columns属性查看和修改DataFrame对象的列信息
8 使用merge函数进行两个DataFrame对象的连接
9 使用drop函数删除某列
10 使用concat对两个DataFrame对象进行拼接
11 使用drop_duplicates函数剔除重复样本
12 将DataFrame对象写入数据库
1 将从MySQL数据库中查询的结果转换为DataFrame类型 df1 = pd.DataFrame(list(results1), columns=['user_id', 'car_id'], dtype=np.int) 注意这里要先把查询的结果用list()函数转化一下。
2 使用groupby函数以某一列为键计算另一列的平均值 import pandas as pd
车型维度评分信息
df1 = pd.DataFrame({'car_id': ['221', '222', '223', '224', '225', '227', '221'], 'feature1': [1, 2.9333, 3, 4, 5, 6.3, 3], 'feature2': [5, 4, 3, 2, 1, 9, None]}) print('df1:') print(df1)
使用groupby函数执行聚合操作
df2 = df1.groupby('car_id').mean() print('df2:') print(df2) 结果如下:
df1:
car_id feature1 feature2
0 221 1.0000 5.0
1 222 2.9333 4.0
2 223 3.0000 3.0
3 224 4.0000 2.0
4 225 5.0000 1.0
5 227 6.3000 9.0
6 221 3.0000 NaN
df2:
feature1 feature2
car_id
221 2.0000 5.0
222 2.9333 4.0
223 3.0000 3.0
224 4.0000 2.0
225 5.0000 1.0
227 6.3000 9.0
3 使用lambda表达式执行逐元素操作
保留两位小数
f = lambda x: '%.2f' % x
使用aplymap函数执行逐元素操作
df3 = df2.applymap(f) print('df3:') print(df3) 结果如下:
df3:
feature1 feature2
car_id
221 2.00 5.00
222 2.93 4.00
223 3.00 3.00
224 4.00 2.00
225 5.00 1.00
227 6.30 9.00
4 使用reset_index函数还原索引
对于使用groupby函数聚合后的DataFrame对象,其用于聚合的键会自动被设定为Index,我们可以使用reset_index函数将其还原为column,以df3为例:
使用reset_index函数还原索引
df4 = df3.reset_index() print('df4:') print(df4) 结果如下:
df4: car_id feature1 feature2 0 221 2.00 5.00 1 222 2.93 4.00 2 223 3.00 3.00 3 224 4.00 2.00 4 225 5.00 1.00 5 227 6.30 9.00 与之对应的是set_index函数,我们可以使用它将某一列或某几列设置为索引。
5 使用head函数查看DataFrame中的前几条样本 print('df4的前两条样本:') print(df4.head(2)) print('df4的前5条样本:') print(df4.head()) 结果如下:
df4的前两条样本: car_id feature1 feature2 0 221 2.00 5.00 1 222 2.93 4.00 df4的前5条样本: car_id feature1 feature2 0 221 2.00 5.00 1 222 2.93 4.00 2 223 3.00 3.00 3 224 4.00 2.00 4 225 5.00 1.00 6 使用shape属性查看DataFrame对象的形状 print('df4的形状:') print(df4.shape) df4的形状: (6, 3) 7 使用columns属性查看和修改DataFrame对象的列信息 print('df4的列信息:') print(df4.columns) df4.columns = ['car_id', 'f1', 'f2'] print('更改列名之后的df4:') print(df4) print('更改列名之后df4的列信息:') print(df4.columns) 结果如下:
df4的列信息: Index(['car_id', 'feature1', 'feature2'], dtype='object') 更改列名之后的df4: car_id f1 f2 0 221 2.00 5.00 1 222 2.93 4.00 2 223 3.00 3.00 3 224 4.00 2.00 4 225 5.00 1.00 5 227 6.30 9.00 更改列名之后df4的列信息: Index(['car_id', 'f1', 'f2'], dtype='object') 8 使用merge函数进行两个DataFrame对象的连接 df1 = pd.DataFrame({'user_id': ['111', '111', '112', '113', '113', '114'], 'car_id': ['221', '222', '223', '224', '225', '227']}) print('df1:') print(df1) df2 = pd.DataFrame({'car_id': ['221', '222', '223', '224', '225', '227', '229'], 'target_id': ['223', '221', '225', '225', '227', '221', '223']}) print('df2:') print(df2) df5 = pd.merge(df1, df2, on='car_id', how='left', left_index=True) # 左连接 print('df5:') print(df5) 结果如下:
df1: user_id car_id 0 111 221 1 111 222 2 112 223 3 113 224 4 113 225 5 114 227 df2: car_id target_id 0 221 223 1 222 221 2 223 225 3 224 225 4 225 227 5 227 221 6 229 223 df5: user_id car_id target_id 0 111 221 223 1 111 222 221 2 112 223 225 3 113 224 225 4 113 225 227 5 114 227 221 9 使用drop函数删除某列 df5 = df5.drop(['car_id'], axis=1) print('新的df5:') print(df5) 结果如下:
新的df5: user_id target_id 0 111 223 1 111 221 2 112 225 3 113 225 4 113 227 5 114 221 10 使用concat对两个DataFrame对象进行拼接 df1 = pd.DataFrame({'user_id': ['111', '111', '112', '113', '113', '114'], 'car_id': ['221', '222', '223', '224', '225', '227']}) print('df1:') print(df1) df6 = pd.concat([df1, df5], axis=0) # 沿着列方向拼接 print('df6:') print(df6) 结果如下:
df1: user_id car_id 0 111 221 1 111 222 2 112 223 3 113 224 4 113 225 5 114 227 df6: user_id car_id 0 111 221 1 111 222 2 112 223 3 113 224 4 113 225 5 114 227 0 111 223 1 111 221 2 112 225 3 113 225 4 113 227 5 114 221 11 使用drop_duplicates函数剔除重复样本 df6.drop_duplicates(subset=['user_id', 'car_id'], keep='first', inplace=True) # 删除重复的行 print('剔除重复样本之后的df6:') print(df6) 结果如下:
剔除重复样本之后的df6: user_id car_id 0 111 221 1 111 222 2 112 223 3 113 224 4 113 225 5 114 227 0 111 223 2 112 225 4 113 227 5 114 221 12 将DataFrame对象写入数据库 DataFrame对象为:
df8
feature1 feature2
user_id
111 2.64 4.00
112 4.00 2.00
113 5.10 4.00
114 4.15 7.00
使用以下语句将其写入数据库:
写入网络数据库
connect = create_engine('mysql+pymysql://user:passwd@ip:port/database_name?charset=utf8') pd.io.sql.to_sql(df8, 'table_name', connect, schema='database_name', if_exists='append') print('完成!!!') 效果截图如下:
待续...
谢谢!
