这两天用pandas做数据分析时学习到一些技巧,在这里记录下来备以后使用。
目录
1 将从MySQL数据库中查询的结果转换为DataFrame类型
7 使用columns属性查看和修改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('完成!!!')
效果截图如下:
待续...
谢谢!