pandas常用指令

作者本人操作数据的一些函数记录
混乱记录。。。。

import pandas as pd

———————————————基础操作——————————————————
# 读取csv文件
csv_pd = pd.read_csv(csv_file,engine='python',encoding='utf-8')

# 读取excel文件,并且跳过第一行,dtype强制转换为str类型
pd.read_excel(return_file, sheet_name="5千万大表排名", skiprows=1, dtype=str)

# 列名更换
df.columns = ['列名','字符'] # 直接按照列下标编辑
# 用rename()方法进行修改
df.rename(columns={'StrTemp':'字符'},inplace=True)

# 将数据转成dataframe形式
pd.DataFrame(res_list)

# 对列进行写操作
csv_pd['master_slave'] = “主”

# 删除某列
df.drop(columns=['id'], inplace=True) # inplace==True为覆盖原有df

# 数据透视
df = pd.pivot_table(df1, index='系统名称', values=['数量'], aggfunc=np.sum)

# 数据分组 ,根据system_name分组,并只展示system_name列和count列,reset_index可以重新定义聚合列的列名
df.groupby("system_name")["system_name"].count().reset_index(name="count").sort_values(by=['count'], ascending=False)
# 使用agg,可以确定我们需要展示的列,并且可以指定展示规则
grouped = df.groupby(["mountpoing", "ip"]).agg({
            "id": "count",
            "disk_rate": "first",
            "avail": "first",
            "total_avail": "first",
            "fstype": "first",
            "env": "first"
        })

# 对某一列数据转成列表
res_list = df1['ip'].to_list()

# dataframe最后一列
df1.iloc[:,-1]

# 排序
df.sort_values(by=['result'], ascending=False, inplace=True)  # 根据result列进行排序

# dataframe转列表嵌套字典(优雅的方式)
res_lists = csv_pd.to_dict(orient='records')

# nan空值用None替换
add_mysql_df.fillna(value='None',inplace=True)
# 处理空值
df.fillna() # 自行百度
df["趋势"].replace(np.inf, 0, inplace=True)  # 替换inf为0

# 导出excel
writer = pd.ExcelWriter(output) # output为可带路径的flie
df.to_excel(writer, sheet_name='database', encoding='gbk')
writer.save()

# 读取多个表单
excel_reader=pd.ExcelFile('文件.xlsx') # 指定文件 
sheet_names = excel_reader.sheet_names # 读取文件的所有表单名,得到列表 
df_data = excel_reader.parse(sheet_name=sheet_names[i]) # 读取表单的内容,i是表单名的索引,等价于pd.read_excel('文件.xlsx',sheet_name=sheet_names[i])

# 写入多个表单
excel_writer = pd.ExcelWriter('文件.xlsx') # 定义writer,选择文件(文件可以不存在) 
df1.to_excel(excel_writer, sheet_name='自定义sheet_name', index=False) # 写入指定表单1
df2.to_excel(excel_writer, sheet_name='自定义sheet_name', index=False) # 表单2
# 这里可以根据自身需求一直加表
excel_writer.save() # 储存文件 excel_writer.close() # 关闭writer

# 合并2个表
# 方法一 横向合并
pd_merge = pd.merge(df1, df2, left_on="df1 key name", right_on="df2 key name", how='left') # 左连接
# 方法二 竖向合并
pd_merge = pd.concat([work_order_df, file_df], axis=0)

# 根据多列条件删除重复列
pd_merge.drop_duplicates(subset=["db_name", "tb_name", "tb_rows",], keep='last', inplace=True)

# 删除name,team两列字段中数值为空的行
df = df.dropna(subset=['name','team'])

# 对特定数据类型进行特殊处理
# 使用astype()函数进行强制类型转换
df['金额'].astype('float')
df['金额'].astype('int')
df['状态'].astype('bool')

# 保留2位小数
df1['avg_time'] = df1['avg_time'].astype(float).apply(lambda x: format(x, '.2f'))  # 对type为float的数据保留2位小数
df["趋势"] = df["趋势"].round(2)


# 对指定列转成数字类型,并且遇到错误选择跳过
change_type_index = ["Host-Memory", "Host-sumcpucore", "Host-harddiskcapacity", ]
not_statistics_df[change_type_index] = not_statistics_df[change_type_index].apply(pd.to_numeric,errors="ignore")

# 筛选数据,ps:筛选prd环境的数据 Host-env_type 且 Host-Status 不等于‘下线’
merge_info_df = merge_info_df[(merge_info_df['Host-env_type'] == 'PRD') & (merge_info_df['Host-Status'] != '下线')]
# 过滤
black_list = ["供应链系统", "物流系统" ]
change_pd = change_pd[~(change_pd['部门'].isin(black_list))]  # ~在此的含义是取反,即不在black_list的部门

# quantile分位数函数,取分位数0.95的值,0.5即取中位数
df[1].quantile(q=0.95)

# 平均数
df["avg"] = df[1].mean(axis=1)
# 求和
df["avg"] = df[1].sum(axis=1)

# 删除符合条件的指定行,并替换原始df(未测试过 )
df.drop(df[(df.score < 50) & (df.score > 20)].index, inplace=True)
rows = df.loc[df['time'].astype(int) > 5].index  # 筛选出所有满足条件的行索引,比如time列值大于5的行


———————————————多线程操作列——————————————————
from pandarallel import pandarallel
# 打补丁
pandarallel.initialize()

# map
df1['Port3306'] = df1[column_name].parallel_map(func) # parallel写法
df1['Port3306'] = df1[column_name].map(func) # 原生写法
# apply
df1['Port9090'] = df1[column_name].parallel_apply(func, parameter=9090)
# 新增一列'Port9090',根据列'Host-ManageIp'生成结果信息
df1['Port9090'] = df1['Host-ManageIp'].apply(func, parameter=9090)

work_order_df['department'] = work_order_df[["host","department"]].apply(
            lambda x: get_department_info(x.host, x.department), axis=1)

# 数据透视表
# 以 注册年月 作为索引,对 会员卡号 列使用pandas内置的count函数进行计算,返回新的df对象,参考文章https://blog.csdn.net/ljh18885466426/article/details/120048268
month_count = df.pivot_table(index='注册年月', values='会员卡号',aggfunc='count')

# 正则查询
# 查找 环境 列,转化为str类型,并正则查找忽略大小写含有-prd-的数据,并替换为UAT
df['环境'] = df['环境'].mask(df['环境'].str.contains("(?i)\.*?-prd-.*?", regex=True), 'UAT')

向量化处理

import numba
 
@numba.vectorize
def f_with_numba(x): 
    return x * 2
 
def f_without_numba(x): 
    return x * 2
 
#方法一:apply逐行操作
df["double_energy"] = df.energy_kwh.apply(f_without_numba)
 
#方法二:向量化运行
df["double_energy"] = df.energy_kwh*2
 
#方法三:运用numba加速
#需要以numpy数组的形式传入
#否则会报错
df["double_energy"] = f_with_numba(df.energy_kwh.to_numpy())
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值