数据分析 pandas库常用操作 (上)

目录

1、读取文件

2、Series

3、DataFrame

4、pandas查询数据

5、新增数据

6、统计数据

7、数据清洗


使用pandas库首先导入:

import pandas as pd

1、读取文件

def pandas_handle_csv():
    path = "./tips.csv"
    # 读取文件
    ratings = pd.read_csv(path)

    # 查看前几行数据
    print(ratings.head())

    # 查看数据的形状,返回(行数、列数)
    print(ratings.shape)

    # 查看索引列
    print(ratings.index)

    # 查看每列的数据类型
    print(ratings.dtypes)

    # 读取txt文本
    path2 = './test.txt'
    # 指定获取方式
    test = pd.read_csv(
        path2,
        sep=">",  # 由该分隔符划分
        header=None,  # 没有标题行
        names=['English', 'text']  # 自定义标题行
    )
    print(test)

    # xlsx格式读取
    path3 = "./testData.xlsx"
    test2 = pd.read_excel(path3)
    print(test2)

    # 读取数据库
    # 引入数据库
    import pymysql
    conn = pymysql.connect(
        host='localhost',
        user='root',
        password='root',
        database='bloggo',
        charset='utf8'
    )
    mysql_page = pd.read_sql("select * from bloggo_test", con=conn)
    print(mysql_page)

2、Series

def pandas_series():
    # Series的使用
    s1 = pd.Series([1, 'a', 5.2, 7])
    # 左侧为索引,右侧为数据
    print(s1)

    # 获取索引
    print(s1.index)

    # 获取数据
    print(s1.values)

    # 将字典转换成series对象
    data = {'name': 'Jack', 'age': 12, 'color': 'red'}
    s3 = pd.Series(data)
    print(s3)

    # 访问series的数据
    print(s3['name'])  # 返回单个数据
    print(type(s3['name']))  # 单独数据的类型
    print(s3[['name', 'age']])  # 返回多条数据
    print(type(s3[['name', 'age']]))  # 返回Series对象类型

3、DataFrame

def pandas_data_frame():
    # dataFrame的属性
    data = {
        'student': ['Alex', 'Jack', 'Tom', 'John'],
        'age': [12, 13, 14, 16],
        'hobby': ['basketball', 'soccer', 'football', 'football']
    }
    df = pd.DataFrame(data)  # 转换成dataFrame对象
    print(df)  # 表格形式的dataFrame对象
    print(df.dtypes)  # 每个属性对应的类型,以及整体的类型
    print(df.columns)  # 所有属性的名称
    print(df.index)  # 数据的条数索引

    print(df['student'])  # 输出该键名所对应的Series对象的以来数据
    print(type(df['student']))  # 类型是Series对象
    print(df[['student', 'age']])  # 输出两列数据的dataframe对象
    print(type(df[['student', 'age']]))  # 返回类型为dataframe对象

    print(df.loc[1])  # 输出键值对形式的Series信息
    print(type(df.loc[1]))  # 类型是Series对象

    # 切片输出数据,与基本python切片不同的是序列从1开始,并且左闭右闭
    print(df.loc[1:3])  # 输出1,2,3条数据的dataframe对象
    print(type(df.loc[1:3]))  # dataframe类型

    print(df.columns.values)  # 获取列名

4、pandas查询数据

def pandas_query():
    df = pd.read_csv('./planets.csv')
    print(df.head())  # 查询前几行数据

    # 设定索引为日期,方便按日期查询
    df.set_index('year', inplace=True)
    print(df.index)  # 此时输出所有时间索引以及条数

    # # 如果索引不上自己想要的形式可以进行处理
    # df.loc[:, 'column1'] = df["column1"] \
    #     .str.replace('a', "") \
    #     .astype('int32')  # 代替字符 # 改变类型

    print(df.loc['2008', 'mass'])  # 得到单个值
    print(df.loc['2008', ['mass', 'distance']])  # 得到一个Series
    print(df.loc[['2008', '2009', '2010'], 'distance'])  # 得到Series
    print(df.loc[['2008', '2009', '2010'], ['mass', 'distance']])  # 得到dataframe
    print(df.loc['2008':'2020', 'mass'])  # 行index按区间
    print(df.loc['2008', 'mass':'distance'])  # 列index按区间
    print(df.loc[df['year'] < '2008', :])  # bool查询

    # 函数查询
    # 直接写lambda表达式
    print(df.loc[lambda method: (df['number'] <= 30) & (df['number2'] > 15), :])

    # 编写自己的函数查询
    def query_my_data(d):
        return d.index.str.startswith('2008') & df['number'] > 1

    print(df.loc[query_my_data, :])

5、新增数据

def pandas_add_new_data():
    df = pd.read_csv('./tips.csv')
    # 注意,df['number']是一个Series后面减法以后返回的是Series
    # 新增方法一 直接操作,最简单的写法
    # 执行以后会在原有的基础上新增一个new_column列
    df.loc[:, 'new_column'] = df['number1'] - df['number2']

    # 新增方法二 apply,通过调用函数来新增,较为常用
    def get_number_type(x):
        if x['number'] > 5:
            return 'small'
        else:
            return 'big'

    # 注意需要设置axis==1,这是series的index是columns
    df.loc[:, 'number'] = df.apply(get_number_type, axis=1)

    # 查看类型的计数
    df['number'].value_counts()

    # 新增方法三 assign可以同时添加多个新的列
    df.assign(
        new_number=lambda x: x['number'] * 9 / 5 + 32,
        new_number2=lambda y: y['number'] / 10 % 10 + 32
    )

    # 新增方法四 按条件选择分组分别赋值
    # 先创建空列(这是第一种创建性列的方法)
    df['column'] = ""
    df.loc[df['column1'] - df['column2'] > 10, 'column'] = '数量差'
    df.loc[df['column1'] - df['column2'] <= 10, 'column'] = '数组正常'
    df['column'].value_counts()  # 统计数量

6、统计数据

def pandas_statistics():
    df = pd.read_csv('./tips.csv')
    # 一、数值型数据
    # 一下子提取所有数组列统计结果
    # 显示各种计数后的属性,如最大值、最小值等
    df.describe()

    # 查看单个Series的数据
    df['number'].mean()

    # 最大值
    df['number'].max()

    # 最小值
    df['number'].min()

    # 二、非数字类型的数据
    # 对应一些非数字类型的数据采用
    # 唯一去重和按值计数
    # 唯一去重
    df['text'].unique()  # 返回全部键名取值的一维数组
    # 按值计数
    df['text2'].value_counts()  # 返回每个对应出现的次数

    # 三、相关系数和协方差
    '''
    1.协方差:衡量同向反向程度,如果协方差为正,说明X,Y同向变化,协方差越大说明同向程度越高;
    如果协方差为负,说明×,Y反向运动,协方差越小说明反向程度越高。
    2.相关系数:衡量相似度程度,当他们的相关系数为1时,说明两个变量变化时的正向相似度最大,
    当相关系数为- 1时,说明两个变量变化的反向相似度最大
    '''
    # 协方差矩阵:
    df.cov()

    # 相关系数矩阵
    df.corr()
    # 单独查看数据之间的相关系数
    df['number1'].corr(df['number2'])
    # 或者
    df['number1'].corr(df['number2'] - df['number3'])
    # !! 这就是特征工程对于机器学习重要性的一个例子

7、数据清

def pandas_miss_value_handle():
    # 第一步
    # 越过两个空从第3个开始处理
    df = pd.read_excel("./testData.xlsx", skiprows=2)

    # 判断是否为空值
    # 为空数据的位置会返回True,有数据的位置返回False
    df.isnull()
    # 为空数据的位置会返回False,有数据的位置返回True
    df['number'].notnull()

    # 第二步
    # 筛选没有空分数的所有行
    df = df.loc[df['number'].notnull(), :]

    # 第三步
    # columns表示按列删除,all表示所有字段都是空值则删,inplace=True表示直接修改可以
    df = df.dropna(axis='columns', how='all', inplace=True)

    # 第四步
    # index表示删除行
    df = df.dropna(axis='index', how='all', inplace=True)
    # 经过三、四步以后全为空的列和行都被删除了

    # 第五步
    # 将分数列为空的填充为0分
    # 方法一
    df = df.fillna({'number': 0})
    # 方法二,等同于
    df.loc[:, 'number'] = df['number'].fillna(0)

    # 第六部
    # 将姓名的缺省值填充
    # 使用前面的有效值填充,用ffill:forward fill
    df.loc[:, 'name'] = df['name'].fillna(method="ffill")

更多详情参考官方文档:API 参考手册 | Pandas 中文

  • 5
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值