ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

pandas数据处理(二)

2022-08-20 19:01:10  阅读:257  来源: 互联网

标签:10 19 08 df 2022 数据处理 pandas zs


简单研究下读取mysql、查询、分组、聚合、绘图。
其还有窗口函数等更加复杂的操作,暂时不做研究。

1. 准备数据

DROP TABLE IF EXISTS `t_user_log`;
CREATE TABLE `t_user_log`  (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `username` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL,
  `msg` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL,
  `create_time` datetime(0) DEFAULT NULL,
  `fullname` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL,
  `userage` int(255) DEFAULT NULL,
  PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 6 CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic;

-- ----------------------------
-- Records of t_user_log
-- ----------------------------
INSERT INTO `t_user_log` VALUES (1, 'zs', '登录系统', '2022-08-19 10:09:37', '张三', 20);
INSERT INTO `t_user_log` VALUES (2, 'zs', '点击用户信息', '2022-08-19 10:09:59', '张三', 20);
INSERT INTO `t_user_log` VALUES (3, 'zs', NULL, '2022-08-19 10:10:12', '张三', 20);
INSERT INTO `t_user_log` VALUES (4, NULL, '登录系统', '2022-08-19 10:10:31', NULL, NULL);
INSERT INTO `t_user_log` VALUES (5, 'ls', '访问产品1', '2022-08-19 10:10:46', '李四', 30);

mysql 数据如下:

2. 分组聚合

1. 读取mysql 数据

import pymysql
import pandas as pd

if __name__ == '__main__':
    # 打开数据库连接
    conn = pymysql.connect(host="localhost",
                           port=3306,
                           user="root",
                           passwd="123456",
                           db="test")
    sql = "select * from `t_user_log` "

    df = pd.read_sql_query(sql, conn)
    print(df.to_string())
    print('=====1')


    # 关闭连接
    conn.close()

结果:

   id username     msg         create_time fullname  userage
0   1       zs    登录系统 2022-08-19 10:09:37       张三     20.0
1   2       zs  点击用户信息 2022-08-19 10:09:59       张三     20.0
2   3       zs    None 2022-08-19 10:10:12       张三     20.0
3   4     None    登录系统 2022-08-19 10:10:31     None      NaN
4   5       ls   访问产品1 2022-08-19 10:10:46       李四     30.0

2. 查询操作

1. 简单的查询:

import pymysql
import pandas as pd

if __name__ == '__main__':
    # 打开数据库连接
    conn = pymysql.connect(host="localhost",
                           port=3306,
                           user="root",
                           passwd="123456",
                           db="test")
    sql = "select * from `t_user_log` "

    df = pd.read_sql_query(sql, conn)
    print(df.to_string())

    print('=====0')
    # 1. 按列选择. 下面等价
    # df.A 等价于 df['A'], 多列可以用 df[['A', 'B']]
    print(df['username'])
    print(df.username)
    print('=====01')
    # []选择行
    # 选择所有数据
    print(df[:])
    print('=====02')
    # 通过索引位置选择某几行,该方法按照左闭右开方式截取数据
    print(df[0:2])

    print('=====1')
    '''
    1.df.loc方法,根据行、列的标签值查询
    # 定位单个元素。xIndex和yIndex 可以省略,也可以多个。 多个写法是 [1, 2]; 范围写法是 0:2
    df.loc[xIndex: yIndex]
    '''
    # 找行
    # 找到第一行
    print(df.loc[0])
    print('=====2')
    # 找到第一行和第三行
    print(df.loc[[0, 2]])
    print('=====21')
    # 按范围找0-3行(开始和结束都包括)
    print(df.loc[0 : 2])
    print('=====2')
    # 找列
    # 单列
    print(df.loc[:, 'username'])
    print('=====3')
    # 多列
    print(df.loc[:, ['username', 'msg']])
    print('=====4')
    # 找username=zs 的fullname 和 userage
    print(df.loc[df['username'] == 'zs', ['fullname', 'userage']])

    '''
    2.df.iloc方法,根据行、列的数字位置查询
    '''
    print('=====5')
    print(df.iloc[0, 0])
    print(df.iloc[0, [0, 1, 2]])

    '''
    3.df.where & mask(where 取反)方法
    '''
    print('=====6')
    print(df.where(df.userage > 20))
    print('=====61')
    print(df.mask(df.userage > 20))

    '''
    4.df.query方法
    '''
    print('=====7')
    print(df.query('username=="zs" & msg=="登录系统"'))


    # 关闭连接
    conn.close()

结果:

   id username     msg         create_time fullname  userage
0   1       zs    登录系统 2022-08-19 10:09:37       张三     20.0
1   2       zs  点击用户信息 2022-08-19 10:09:59       张三     20.0
2   3       zs    None 2022-08-19 10:10:12       张三     20.0
3   4     None    登录系统 2022-08-19 10:10:31     None      NaN
4   5       ls   访问产品1 2022-08-19 10:10:46       李四     30.0
=====0
0      zs
1      zs
2      zs
3    None
4      ls
Name: username, dtype: object
0      zs
1      zs
2      zs
3    None
4      ls
Name: username, dtype: object
=====01
   id username     msg         create_time fullname  userage
0   1       zs    登录系统 2022-08-19 10:09:37       张三     20.0
1   2       zs  点击用户信息 2022-08-19 10:09:59       张三     20.0
2   3       zs    None 2022-08-19 10:10:12       张三     20.0
3   4     None    登录系统 2022-08-19 10:10:31     None      NaN
4   5       ls   访问产品1 2022-08-19 10:10:46       李四     30.0
=====02
   id username     msg         create_time fullname  userage
0   1       zs    登录系统 2022-08-19 10:09:37       张三     20.0
1   2       zs  点击用户信息 2022-08-19 10:09:59       张三     20.0
=====1
id                               1
username                        zs
msg                           登录系统
create_time    2022-08-19 10:09:37
fullname                        张三
userage                       20.0
Name: 0, dtype: object
=====2
   id username   msg         create_time fullname  userage
0   1       zs  登录系统 2022-08-19 10:09:37       张三     20.0
2   3       zs  None 2022-08-19 10:10:12       张三     20.0
=====21
   id username     msg         create_time fullname  userage
0   1       zs    登录系统 2022-08-19 10:09:37       张三     20.0
1   2       zs  点击用户信息 2022-08-19 10:09:59       张三     20.0
2   3       zs    None 2022-08-19 10:10:12       张三     20.0
=====2
0      zs
1      zs
2      zs
3    None
4      ls
Name: username, dtype: object
=====3
  username     msg
0       zs    登录系统
1       zs  点击用户信息
2       zs    None
3     None    登录系统
4       ls   访问产品1
=====4
  fullname  userage
0       张三     20.0
1       张三     20.0
2       张三     20.0
=====5
1
id             1
username      zs
msg         登录系统
Name: 0, dtype: object
=====6
    id username    msg         create_time fullname  userage
0  NaN      NaN    NaN                 NaT      NaN      NaN
1  NaN      NaN    NaN                 NaT      NaN      NaN
2  NaN      NaN    NaN                 NaT      NaN      NaN
3  NaN      NaN    NaN                 NaT      NaN      NaN
4  5.0       ls  访问产品1 2022-08-19 10:10:46       李四     30.0
=====61
    id username     msg         create_time fullname  userage
0  1.0       zs    登录系统 2022-08-19 10:09:37       张三     20.0
1  2.0       zs  点击用户信息 2022-08-19 10:09:59       张三     20.0
2  3.0       zs    None 2022-08-19 10:10:12       张三     20.0
3  4.0     None    登录系统 2022-08-19 10:10:31     None      NaN
4  NaN      NaN     NaN                 NaT      NaN      NaN
=====7
   id username   msg         create_time fullname  userage
0   1       zs  登录系统 2022-08-19 10:09:37       张三     20.0

2. 查找某一列为空的数据:

import pymysql
import pandas as pd

if __name__ == '__main__':
    # 打开数据库连接
    conn = pymysql.connect(host="localhost",
                           port=3306,
                           user="root",
                           passwd="123456",
                           db="test")
    sql = "select * from `t_user_log` "

    df = pd.read_sql_query(sql, conn)
    print(df.to_string())

    print('=====0')
    # 查找为空的数据(查出来之后,其他数据全部为NaN)
    print(df.where(df['msg'].isnull()))
    print('=====1')
    # 将其他无效数据剔除
    print(df.where(df['msg'].isnull()).dropna(subset=['id']).to_string())

    # 关闭连接
    conn.close()

结果:

   id username     msg         create_time fullname  userage
0   1       zs    登录系统 2022-08-19 10:09:37       张三     20.0
1   2       zs  点击用户信息 2022-08-19 10:09:59       张三     20.0
2   3       zs    None 2022-08-19 10:10:12       张三     20.0
3   4     None    登录系统 2022-08-19 10:10:31     None      NaN
4   5       ls   访问产品1 2022-08-19 10:10:46       李四     30.0
=====0
    id username   msg         create_time fullname  userage
0  NaN      NaN   NaN                 NaT      NaN      NaN
1  NaN      NaN   NaN                 NaT      NaN      NaN
2  3.0       zs  None 2022-08-19 10:10:12       张三     20.0
3  NaN      NaN   NaN                 NaT      NaN      NaN
4  NaN      NaN   NaN                 NaT      NaN      NaN
=====1
    id username   msg         create_time fullname  userage
2  3.0       zs  None 2022-08-19 10:10:12       张三     20.0

3. 简单的统计以及聚合

import pymysql
import pandas as pd

if __name__ == '__main__':
    # 打开数据库连接
    conn = pymysql.connect(host="localhost",
                           port=3306,
                           user="root",
                           passwd="123456",
                           db="test")
    sql = "select * from `t_user_log` "

    df = pd.read_sql_query(sql, conn)
    print(df.to_string())

    print("======1")
    # 返回series
    print(df.count().__class__)
    print(df.count())
    print("======2")
    print(df.count().max())
    print("======3")
    print(df.id.sum())
    print(df.id.min())
    print(df.id.max())
    # 均值
    print(df.id.mean())
    # 中位数
    print(df.id.median())
    # 众数:出现次数最多的
    print(df.username.mode())


    # 关闭连接
    conn.close()

结果:

   id username     msg         create_time fullname  userage
0   1       zs    登录系统 2022-08-19 10:09:37       张三     20.0
1   2       zs  点击用户信息 2022-08-19 10:09:59       张三     20.0
2   3       zs    None 2022-08-19 10:10:12       张三     20.0
3   4     None    登录系统 2022-08-19 10:10:31     None      NaN
4   5       ls   访问产品1 2022-08-19 10:10:46       李四     30.0
======1
<class 'pandas.core.series.Series'>
id             5
username       4
msg            4
create_time    5
fullname       4
userage        4
dtype: int64
======2
5
======3
15
1
5
3.0
3.0
0    登录系统
Name: msg, dtype: object

4. 排序

import pymysql
import pandas as pd

if __name__ == '__main__':
    # 打开数据库连接
    conn = pymysql.connect(host="localhost",
                           port=3306,
                           user="root",
                           passwd="123456",
                           db="test")
    sql = "select * from `t_user_log` "

    df = pd.read_sql_query(sql, conn)
    print(df.to_string())
    print('=====1')
    # 按横坐标标签进行排序,逆序排序。 默认升序
    print(df.sort_index(ascending=False))
    print('=====2')
    # 按照列进行排序
    print(df.sort_values(by='id', ascending=False))
    print('=====3')
    # 按照列进行排序, 且指定排序算法
    # mergesort、 heapsort、 quicksort
    print(df.sort_values(by='userage', ascending=False, kind='quicksort'))


    # 关闭连接
    conn.close()

结果:

   id username     msg         create_time fullname  userage
0   1       zs    登录系统 2022-08-19 10:09:37       张三     20.0
1   2       zs  点击用户信息 2022-08-19 10:09:59       张三     20.0
2   3       zs    None 2022-08-19 10:10:12       张三     20.0
3   4     None    登录系统 2022-08-19 10:10:31     None      NaN
4   5       ls   访问产品1 2022-08-19 10:10:46       李四     30.0
=====1
   id username     msg         create_time fullname  userage
4   5       ls   访问产品1 2022-08-19 10:10:46       李四     30.0
3   4     None    登录系统 2022-08-19 10:10:31     None      NaN
2   3       zs    None 2022-08-19 10:10:12       张三     20.0
1   2       zs  点击用户信息 2022-08-19 10:09:59       张三     20.0
0   1       zs    登录系统 2022-08-19 10:09:37       张三     20.0
=====2
   id username     msg         create_time fullname  userage
4   5       ls   访问产品1 2022-08-19 10:10:46       李四     30.0
3   4     None    登录系统 2022-08-19 10:10:31     None      NaN
2   3       zs    None 2022-08-19 10:10:12       张三     20.0
1   2       zs  点击用户信息 2022-08-19 10:09:59       张三     20.0
0   1       zs    登录系统 2022-08-19 10:09:37       张三     20.0
=====3
   id username     msg         create_time fullname  userage
4   5       ls   访问产品1 2022-08-19 10:10:46       李四     30.0
0   1       zs    登录系统 2022-08-19 10:09:37       张三     20.0
1   2       zs  点击用户信息 2022-08-19 10:09:59       张三     20.0
2   3       zs    None 2022-08-19 10:10:12       张三     20.0
3   4     None    登录系统 2022-08-19 10:10:31     None      NaN

3. 数据更新

import pymysql
import pandas as pd

if __name__ == '__main__':
    # 打开数据库连接
    conn = pymysql.connect(host="localhost",
                           port=3306,
                           user="root",
                           passwd="123456",
                           db="test")
    sql = "select * from `t_user_log` "

    df = pd.read_sql_query(sql, conn)
    print(df.to_string())

    print("======1")
    # 更新单个位置
    df.loc[3, 'username'] = 'zs'
    df.loc[3, 'fullname'] = '张三'
    print(df.to_string())

    print("======1")
    # 新增一行
    df.loc[5]=df.loc[4]
    print(df.to_string())

    # 新增一列
    print("======2")
    df['username(fullname)'] = df.username + '(' + df.fullname + ')'
    print(df.to_string())


    # 关闭连接
    conn.close()

结果:

   id username     msg         create_time fullname  userage
0   1       zs    登录系统 2022-08-19 10:09:37       张三     20.0
1   2       zs  点击用户信息 2022-08-19 10:09:59       张三     20.0
2   3       zs    None 2022-08-19 10:10:12       张三     20.0
3   4     None    登录系统 2022-08-19 10:10:31     None      NaN
4   5       ls   访问产品1 2022-08-19 10:10:46       李四     30.0
======1
   id username     msg         create_time fullname  userage
0   1       zs    登录系统 2022-08-19 10:09:37       张三     20.0
1   2       zs  点击用户信息 2022-08-19 10:09:59       张三     20.0
2   3       zs    None 2022-08-19 10:10:12       张三     20.0
3   4       zs    登录系统 2022-08-19 10:10:31       张三      NaN
4   5       ls   访问产品1 2022-08-19 10:10:46       李四     30.0
======1
   id username     msg         create_time fullname  userage
0   1       zs    登录系统 2022-08-19 10:09:37       张三     20.0
1   2       zs  点击用户信息 2022-08-19 10:09:59       张三     20.0
2   3       zs    None 2022-08-19 10:10:12       张三     20.0
3   4       zs    登录系统 2022-08-19 10:10:31       张三      NaN
4   5       ls   访问产品1 2022-08-19 10:10:46       李四     30.0
5   5       ls   访问产品1 2022-08-19 10:10:46       李四     30.0
======2
   id username     msg         create_time fullname  userage username(fullname)
0   1       zs    登录系统 2022-08-19 10:09:37       张三     20.0             zs(张三)
1   2       zs  点击用户信息 2022-08-19 10:09:59       张三     20.0             zs(张三)
2   3       zs    None 2022-08-19 10:10:12       张三     20.0             zs(张三)
3   4       zs    登录系统 2022-08-19 10:10:31       张三      NaN             zs(张三)
4   5       ls   访问产品1 2022-08-19 10:10:46       李四     30.0             ls(李四)
5   5       ls   访问产品1 2022-08-19 10:10:46       李四     30.0             ls(李四)

4. 删除数据

import pymysql
import pandas as pd

if __name__ == '__main__':
    # 打开数据库连接
    conn = pymysql.connect(host="localhost",
                           port=3306,
                           user="root",
                           passwd="123456",
                           db="test")
    sql = "select * from `t_user_log` "

    df = pd.read_sql_query(sql, conn)
    print(df.to_string())

    print("======1")
    # 根据index 行号进行删除
    df.drop(0, inplace=True)
    print(df.to_string())
    print("======2")
    # 找到msg为空的然后删除
    # 实际是先找到为空的数据,然后找到行号index。 然后根据index进行删除
    df1 = df.where(df['msg'].isnull()).dropna(subset=['id'])
    for x in df1.index:
        print("x: ", x)
        print(df.loc[x])
        df.drop(x, inplace=True)
    print("======3")
    print(df.to_string())


    # 关闭连接
    conn.close()

结果:

   id username     msg         create_time fullname  userage
0   1       zs    登录系统 2022-08-19 10:09:37       张三     20.0
1   2       zs  点击用户信息 2022-08-19 10:09:59       张三     20.0
2   3       zs    None 2022-08-19 10:10:12       张三     20.0
3   4     None    登录系统 2022-08-19 10:10:31     None      NaN
4   5       ls   访问产品1 2022-08-19 10:10:46       李四     30.0
======1
   id username     msg         create_time fullname  userage
1   2       zs  点击用户信息 2022-08-19 10:09:59       张三     20.0
2   3       zs    None 2022-08-19 10:10:12       张三     20.0
3   4     None    登录系统 2022-08-19 10:10:31     None      NaN
4   5       ls   访问产品1 2022-08-19 10:10:46       李四     30.0
======2
x:  2
id                               3
username                        zs
msg                           None
create_time    2022-08-19 10:10:12
fullname                        张三
userage                       20.0
Name: 2, dtype: object
======3
   id username     msg         create_time fullname  userage
1   2       zs  点击用户信息 2022-08-19 10:09:59       张三     20.0
3   4     None    登录系统 2022-08-19 10:10:31     None      NaN
4   5       ls   访问产品1 2022-08-19 10:10:46       李四     30.0

5. 简单分组聚合

import numpy as np
import pymysql
import pandas as pd

if __name__ == '__main__':
    # 打开数据库连接
    conn = pymysql.connect(host="localhost",
                           port=3306,
                           user="root",
                           passwd="123456",
                           db="test")
    sql = "select * from `t_user_log` "

    df = pd.read_sql_query(sql, conn)
    print(df.to_string())

    print("======1")
    print(df.groupby('username').max())
    print("======2")
    print(df.groupby('username').count())
    print("======3")
    print(df.groupby('username').min())
    print("======4")
    print(df.groupby('username').mean())
    print("======5")
    # agg 自选聚合函数
    print(df.groupby(['username', 'msg']).agg({'id': [np.count_nonzero]}).rename(columns={'count_nonzero': '次数'}))


    # 关闭连接
    conn.close()

结果:

   id username     msg         create_time fullname  userage
0   1       zs    登录系统 2022-08-19 10:09:37       张三     20.0
1   2       zs  点击用户信息 2022-08-19 10:09:59       张三     20.0
2   3       zs    None 2022-08-19 10:10:12       张三     20.0
3   4     None    登录系统 2022-08-19 10:10:31     None      NaN
4   5       ls   访问产品1 2022-08-19 10:10:46       李四     30.0
======1
E:\pyspace\craw\pandas_test\client4.py:18: FutureWarning: Dropping invalid columns in DataFrameGroupBy.max is deprecated. In a future version, a TypeError will be raised. Before calling .max, select only columns which should be valid for the function.
  print(df.groupby('username').max())
          id         create_time fullname  userage
username                                          
ls         5 2022-08-19 10:10:46       李四     30.0
zs         3 2022-08-19 10:10:12       张三     20.0
======2
          id  msg  create_time  fullname  userage
username                                         
ls         1    1            1         1        1
zs         3    2            3         3        3
======3
          id         create_time fullname  userage
username                                          
ls         5 2022-08-19 10:10:46       李四     30.0
zs         1 2022-08-19 10:09:37       张三     20.0
======4
           id  userage
username              
ls        5.0     30.0
zs        2.0     20.0
======5
                id
                次数
username msg      
ls       访问产品1   1
zs       点击用户信息  1
         登录系统    1

6. 绘图

​ 简单的画图。(需要借助于Matplotlib 库。 Matplotlib 是一个专门的画图库 )

​ Pandas 之所以能够实现了数据可视化,主要利用了 Matplotlib 库的 plot() 方法,它对 plot() 方法做了简单的封装,因此您可以直接调用该接口。

参考: https://www.runoob.com/matplotlib/matplotlib-tutorial.html
http://c.biancheng.net/pandas/plot.html

1. 简单折线图

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt

#创建包含时间序列的数据
df = pd.DataFrame(np.random.randn(8,4),index=pd.date_range('2/1/2020',periods=8), columns=list('ABCD'))
# 下面三种方式是等价的,默认是折线图
# df.plot()
# df.plot(kind='line')
df.plot.line()
plt.show()

还有下面相关的图:

柱状图:bar() 或 barh()
直方图:hist()
箱状箱:box()
区域图:area()
散点图:scatter()
饼图: pie()

2. 简单的柱状图

import numpy as np
import matplotlib.pyplot as plt

x = np.array(["Runoob-1", "Runoob-2", "Runoob-3", "C-RUNOOB"])
y = np.array([12, 22, 6, 18])

plt.bar(x, y, color = ["#4CAF50","red","hotpink","#556B2F"])
plt.show()

​ 还可以自己设置柱状图的宽度等参数。

3. 基于测试数据生成用户、count 柱状图

import matplotlib.pyplot as plt
import pymysql
import pandas as pd

if __name__ == '__main__':
    # 打开数据库连接
    conn = pymysql.connect(host="localhost",
                           port=3306,
                           user="root",
                           passwd="123456",
                           db="test")
    sql = "select * from `t_user_log` "

    df = pd.read_sql_query(sql, conn)
    print(df.to_string())
    print('=====1')
    df2 = df.groupby('username').count()._rename(columns={'id': 'count'}).loc[:,['count']]
    df2.plot.bar()
    plt.title('user-count')
    plt.show()


    # 关闭连接
    conn.close()

结果:

4. 基于用户、count 生成饼图

import matplotlib.pyplot as plt
import pymysql
import pandas as pd

if __name__ == '__main__':
    # 打开数据库连接
    conn = pymysql.connect(host="localhost",
                           port=3306,
                           user="root",
                           passwd="123456",
                           db="test")
    sql = "select * from `t_user_log` "

    df = pd.read_sql_query(sql, conn)
    print('=====1')
    df2 = df.groupby('username').count()._rename(columns={'id': 'count'}).loc[:,['count']]
    plt.pie(df2['count'], labels=df2.index,
            autopct='%.2f%%')
    plt.title('user-count')
    plt.show()


    # 关闭连接
    conn.close()

结果:

标签:10,19,08,df,2022,数据处理,pandas,zs
来源: https://www.cnblogs.com/qlqwjy/p/16603047.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有