Python Pandas 应用型操作

yueyue · 2022年02月14日 · 1648 次阅读

之前在统计导出的订单数据时,有用到 pandas 模块,下面是自己常用的一些操作,当成备忘录做个总结

写数据

def data_to_csv():
    """
    向CSV写入数据
    Step1:生成表格型数据结构,确认文件内容表头字段
           # pandas.DataFrame( data, index, columns, dtype, copy)
           # data:一组数据(ndarray、series, map, lists, dict 等类型)。
           # index:行标签
           # columns:列标签
           # dtype:数据类型
           # copy:拷贝数据,默认为 False。
    Step2:判断文件是否存在,存在则保留列名
    Step3:将demo数据写入CSV
    """
    try:
        df = pd.DataFrame(
            {'姓名': "张三", '性别': "男"}, index=[0])
        # 判断文件是否存在  True:保留列名 False:反之
        if os.path.exists(save_file):
            # 文件存在
            df.to_csv(save_file, encoding="utf-8", mode='a', index=False,
                      index_label=False, header=False)
        else:
            # 文件不存在
            df.to_csv(save_file, encoding="utf-8", mode='a', index=False,
                      index_label=False, header=True)
    except Exception as ex:
        print('写入文件失败 {}'.format(ex))
        raise ex
def data_to_mysql():
    """
    读取csv写入数据到mysql to_sql csv文件内容字段顺序需要和数据库完全一致
    :param insert_data:
    :param table:
    :return:
    """
    try:
        engine = create_engine(
            'mysql+pymysql://{0}:{1}@{2}/{3}?charset=utf8'.format('mysql_username', 'mysql_password',
                                                                  'mysql_host',
                                                                  'mysql_db_name'), encoding='utf-8')
        pandas.read_csv("filename").to_sql("mysql_table_name", engine, if_exists='append', index=False)
    except Exception as ex:
        print('插入数据异常{}'.format(ex))
        raise ex

读数据

import pandas as pd
def read_csv_data():
    """
    读取csv文件
    :return:
    """
    try:
        content = pd.read_csv("filename")
        print("文件内容 {}".format(content))
    except Exception as ex:
        print("读取csv文件异常 {}".format(ex))
        raise ex

def read_excel_data():
    """
    读取excel文件 指定sheet使用sheetname属性 sheet页码下标从0开始,或者直接传sheetname
    :return:
    """
    try:
        content = pd.read_excel("filename"sheet_name=0)
        # content = pd.read_excel(os.path.join(os.getcwd(), "..") + "\\**\\***.xlsx")
        # 设置参数打印全行数据 反之会打印...隐藏部分行数据
        pd.set_option('display.max_columns', None) 
        pd.set_option('display.max_rows', None)
        print("文件内容 {}".format(content))
    except Exception as ex:
        print("读取excel文件异常 {}".format(ex))
        raise ex

操作数据

# -- coding: utf-8 --
import pandas


def data_handle():
    # 构建df
    df1 = pandas.DataFrame([
        {"商品链接": "https://mp.weixin.qq.com/s/Rh-9BiMD662BCXGdXMBbZw","下单量":1000,"商品单价": 0.33,"商品价格":33,"下单时间":11},
        {"商品链接": "https://mp.weixin.qq.com/s/Y2-TuB33JXaNsNhaB7-PgQ", "下单量": 3600, "商品单价": 0.33, "商品价格": '', "下单时间": 12},
        {"商品链接": "https://mp.weixin.qq.com/s/7K-prA5BDvy9ZBnmNCFyTg", "下单量": 1000, "商品单价": 0.32, "商品价格": 32,"下单时间": 12},
        {"商品链接": "https://mp.weixin.qq.com/s/FT-prA5BDvy9ZBnmNCgHKL", "下单量": 500, "商品单价": 0.32, "商品价格": None, "下单时间": 12},
        {"商品链接": "https://mp.weixin.qq.com/s/Rh-9BiMD662BCXGdXMBbZw", "下单量": 1000, "商品单价": 0.34, "商品价格": 34,"下单时间": 12},
        {"商品链接": "https://mp.weixin.qq.com/s/GS-0SDFASHDSsasdsdc435", "下单量": 1000, "商品单价": 0.34, "商品价格": 34, "下单时间": 13},
        {"商品链接": "https://mp.weixin.qq.com/s/LV-324234nkjfsfdscSASD", "下单量": 1000, "商品单价": 0.34, "商品价格": 34, "下单时间": 14},
        {"商品链接": "https://mp.weixin.qq.com/s/WS-904955daBCXGdXMBbZw", "下单量": 1000, "商品单价": 0.34, "商品价格": 34, "下单时间": 14},
        {"商品链接": "https://mp.weixin.qq.com/s/WS-904955daBCXGdXMBbZw", "下单量": 1000, "商品单价": 0.34, "商品价格": 34, "下单时间": 15}

    ])
    df2 = pandas.DataFrame([
        {"商品链接": "https://mp.weixin.qq.com/s/Rh-9BiMD662BCXGdXMBbZw", "下单量": 1000, "商品单价": 0.33, "商品价格": 33,"下单时间": 11},
        {"商品链接": "https://mp.weixin.qq.com/s/XC-453RiMDWEREBCXGJGHR", "下单量": 500, "商品单价": 0.33, "商品价格": "", "下单时间": 12}
    ])
    #  打印df数据
    print(df1)
    print(df2)
    pandas.set_option('display.max_columns', None)
    pandas.set_option('display.max_rows', None)

    # 行列获取
    print("获取df1行列总数 {}".format(df1.shape))  # 获取df行列总数  返回(5, 5)

    print("获取df1总行数 {}".format(df1.shape[0]))  # 取行数
    print("获取df1第1行数据 {}".format(df1.loc[0]))  # df.loc[index] 根据索引获取单行数据
    print("获取df1前3行数据 {}".format(df1.loc[0: 2]))  # 选取在此索引范围内的多行数据
    print("获取df1前3行数据 {}".format(df1.head(3)))  # 看前3行的数据,默认为5
    print("获取df1后3行数据 {}".format(df1.tail(3)))  # 看最后3行的数据,默认为5
    print("按照0.5比例随机获取df行数据 {}".format(df1.sample(frac=0.5)))  # 按照0.5比例随机抽取数据
    print("获取df1第1行和第3行数据 {}".format(df1.loc[[0, 2]]))  # df.loc[[index1,index2,......]] 根据索引获取多行数据
    print("获取df1第2列至第4列所有行数据 {}".format(df1.iloc[:, 1:4]))  # 获取 1-3索引所有行记录

    print("获取df1总列数 {}".format(df1.shape[1]))  # 取列数
    print("获取df1列名 {}".format(df1.columns))  # 获取列名 返回列表
    print("获取df1下单量列所有数据 {}".format(df1["下单量"]))  # 获取指定列数据 df[“列名”]获取列数据
    print("获取df1下单量和商品价格列数据 {}".format(df1[["下单量", "商品价格"]]))  # df[[“列名1”,"列名2",...]获取多列数据
    print("获取df1商品链接列数据并保存为list {}".format(df1["商品链接"].values))  # 指定列的数据保存为list way1
    print("获取df1下单量列数据并保存为list {}".format(df1["下单量"].values.tolist()))  # 指定列的数据保存为list way2

    # 行列新增
    df1.loc["新增1行"] = ["https://mp.weixin.qq.com/s/Rh-9Bi274223BCXGdXMBbZw", 100, 0.1, 10, None]  # 增加行 way1
    df1.at["再次新增1行"] = ["https://mp.weixin.qq.com/s/Rh-9Bi232232BCXGdXMBbZw", 200, 0.2, 20, None]  #  增加行 way2
    print("df1新增2行数据 {}".format(df1))
    s = pandas.Series(["https://mp.weixin.qq.com/s/Rh-9BiMD662BCXGdXMBbZw", 700, 0.2, 20, None], index=df1.columns, name='5') # 增加行 way3
    df_add_row = df1.append(s)
    print("df1末尾新增1行数据,index自动增长 {}".format(df_add_row))

    df1_add_column = pandas.concat([df1, pandas.DataFrame(columns=list('d'))]) # 增加列 way1  # 末尾添加一列 列只能是abcd
    print("df1新增1列,列名为d,d列值为NaN {}".format(df1_add_column))
    df1['column1'] = 1 # 增加列 way2
    print("df1再次新增1列,列名为column1,column1列值为1 {}".format(df1))
    df1.insert(1, 'column2', 2, allow_duplicates=False)  # 增加列 way3 #df.insert(添加列位置索引序号,添加列名,数值,是否允许列名重复)
    print("df1指定位置添加1列,列名为column2,column2列值为2 {}".format(df1))

    # 数据统计
    print("统计df1值为数字类型列count mean std min 25% 50% 75%  max {}".format(df1.describe()))  # 只会对数字类型的列有效 对每一列是数字类型的数据进行统计 返回count mean std min 25% 50% 75%  max
    print("统计df1商品单价最大值 {}".format(df1["商品单价"].max()))
    print("统计df1商品单价最小值 {}".format(df1["商品单价"].min()))
    print("统计df1商品单价标准差 {}".format(df1["商品单价"].std()))
    print("统计df1下单笔数 {}".format(df1["商品单价"].count()))
    print("统计df1商品单价中位数 {}".format(df1["商品单价"].median()))  #
    print("统计df1商品单价25%分位数 {}".format(df1["商品单价"].quantile()))
    print("统计df1商品单价平均值 {}".format(df1['商品单价'].mean()))  # 求一整列的均值,返回numpy
    print("统计df1商品单价列,商品价格列平均值 {}".format(df1[['商品单价', '商品价格']].mean()))  # 求多列的均值
    print("统计df1每条商品链接的出现次数 {}".format(df1["商品链接"].value_counts()))  # 统计每条商品链接的出现次数
    print("统计每个时间段的下单量总计 {}".format((df1.groupby(by=['下单时间']).sum())['下单量']))  # 统计每个时间段的下单量总计 sum()函数
    print("获取每个商品链接的总计下单量 {}".format(df1.groupby('商品链接')['下单量'].agg('sum'))) # 获取每个商品链接的总计下单量 agg聚合
    print("按照下单时间聚合下单量小于4000的订单笔数 {}".format((df1.loc[df1["下单量"] < 4000]).groupby(by=['下单时间']).count()))   #  按照下单时间聚合下单量小于4000的订单笔数 count()获取次数 多个运算条件注意括号 单条件
    print("按照下单时间聚合下单量小于2000并且大于等于500的订单笔数 {}".format((df1.loc[(df1['下单量'] >= 500) & (df1['下单量'] < 2000)].groupby(by=['下单时间']).count()))) # 如上 多查询条件

    # 空值(None)操作
    print("输出df1列是否含None值 {}".format(df1.notnull()))  # 判断是否为空值(None),反向函数为isnull()
    print("输出df1商品价格列不为空的行 {}".format(df1[df1['商品价格'].notnull()])) # 将'商品价格'列不为空的行输出
    print("删除df1有None值的行 {}".format(df1.dropna(how='any')))  # 将带有空值(None)的行删除。how='any'意味着,该行中只要有一个空值,就会删除,可以改成all。
    df1['商品价格'].fillna(value=df1['下单量'], inplace=True)  # 直接将缺失值赋值其他列的数据 fillna(value=被替换的数据)
    print("更新df1商品价格列为None的数据为下单量值".format(df1))
    print("删除df1商品价格和商品单价任意列含None的行 {}".format(df1.dropna(subset=['商品价格', '商品单价'], how='any')))  # subset参数指定在特定的列中判断空值。  all代表全部为空,才会删除该行;any只要一个为空,就删除该行。

    # 数据排序
    print("按照下单量升序显示df1数据 {}".format(df1.sort_values(by=['下单量'], ascending=1)))  # 按照下单量升序显示数据,acsending:1升序,0降序
    print("按照下单量,商品单价升序显示df1数据 {}".format(df1.sort_values(by=['下单量', '商品单价'], ascending=[1, 1])))  # 按照多列进行排序

    # 行列转换
    print("df1行列转换 {}".format(df1.T))

    # 数据去重
    link_distinct = df1.drop_duplicates(subset=['商品链接'], keep=False)  #去除重复的商品链接 keep:重复数据保留配置  keep: Literal["first"] | Literal["last"] | Literal[False] = "first",
    print("去除df1重复的商品链接 {}".format(link_distinct))

    # 集合获取
    print("获取df1与df2的差集 {}".format(df1[~df1['商品链接'].isin(df2["商品链接"].values.tolist())])) # 获取df1与df2的差集
    print("获取df2与df1指定列的交集数据 {}".format(df2[df2['商品链接'].isin(df1["商品链接"].values)]))  # 获取df2与df1指定列的交集数据

    # 行列编辑 (编辑,删除)
    df1['下单量'] = df1['下单量'].replace(3600, 5600)  # 将指定列(下单量)的3600修改为5600 way1
    print("更新df1下单量列值=3600的值为5600 {}".format(df1))
    df1['下单量'].loc[df1['下单量'] < 2000] = 2500
    print("更新df1下单量列值<2000的值为2500 {}".format(df1))

    del df1['商品链接']  # 删除指定列 way1
    print("删除df1商品链接列 {}".format(df1))
    df1.drop(['下单量'], axis=1, inplace=True)  # 删除指定列 way2
    print("删除df1下单量列 {}".format(df1))

    df1.drop(df1.index[0], inplace=True)  # 删除第1行
    print("删除df1第1行数据 {}".format(df1))
    df1.drop(df1.index[0:2], inplace=True)  # 删除前2行
    print("删除df1前2行数据 {}".format(df1))
    df1.drop(df1.index[[0, 1]], inplace=True)  # 删除第1第2行
    print("删除df1第1行和第2行数据 {}".format(df1))

暂无回复。
需要 登录 后方可回复, 如果你还没有账号请点击这里 注册