pandas常用方法

news2024/11/24 11:22:27

一、提要

pandas对于处理表格类数据来说是非常方便的模块,同时也是做数据分析绕不开的第三方库。这里将工作中常用到的各种处理方法记录下来

二、常用方法

接下来的以 df 表示我们要处理的 dataframe 表格数据

1、取值

# 循环遍历取值
for i in range(len(df)):
   yh_bm = df.iloc[i]['yh_bm']
   cp_name = df.iloc[i]['cp_name']
可以通过循环将该表所有编码,名称全部依次取出


# 下面这两个写法效果相同,都是取第几行第几列的那个值
jz_date = df.iloc[i][num]
jz_date = df.iloc[i,num]


# 取行名为 合计,列名为 穿透前金额 的值
df = df[df.values == '合计']['穿透前金额'].values[0]

# 定位取值
cp_name = df.loc[df['yh_bm'] =='345634A', 'cp_name'].values[0]
print(cp_name)
意思是取 yh_bm 这一列中,值为 345634A 的这一行中 cp_name 的值。其中values是将所有符合条件的值都取出来,列表形式。values[0]即是取第一个符合条件的值。

2、切片

# 总行数
z_ls=df.shape[0]
# 总列数
con1 = df.shape[1]
# 获取前10行
con=df.loc[:10]
# 取所有行中第一到二列
data=df.iloc[:,1:2]

3、删除Pandas DataFrame中的某些字段

import pandas as pd

# 创建一个示例DataFrame
data = {'A': [1, 2, 3],
        'B': [4, 5, 6],
        'C': [7, 8, 9]}
df = pd.DataFrame(data)

# 删除字段B和C
df = df.drop(['B', 'C'], axis=1)

# 打印结果
print(df)

   A
0  1
1  2
2  3

4、获取索引

# 取出所有值为‘估值日’对应的索引行,列表形式展示
df = df[df.values == '估值日'].index.values.tolist()

5、判断并赋值

# 查询并赋值(如果id字段为'',产品状态赋值为新增)
df.loc[df['id'] == '', '产品状态'] = '新增'
# 如果id字段为'',产品状态赋值为新增,否则产品状态赋值为已存在。
df['产品状态'] = df.id.apply(lambda x: '新增' if x=='' else '已存在')
# 将 实际到期日<库内实际到期日 的各行数据,是否提前终止 字段值改为是
df.loc[df['实际到期日'] < df['库内实际到期日'], '是否提前终止'] = '是'
# 将 净值日期大于等于2022/8/24并且beizhu字段值为1的数据, 净值分配类型 字段值改为 扣除超额收益
df.loc[(df['净值日期'] >= datetime.datetime(2022, 8, 24)) & (df['beizhu'] == '1'), '净值分配类型'] = '扣除超额收益'

6、取某字段内包含某字段值的数据

# 取产品全称字段内包含备注字段值的数据
df=df[df.apply(lambda x: x.beizhu in x.产品全称, axis=1)]

输入:
产品全称	beizhu	
中国	       中	
中国	       国	
中国	       年	

输出:
  产品全称 beizhu  
0   中国      中  
1   中国      国  

7、日期格式处理

# 净值日期减一天
df['净值日期'] = pd.to_datetime(df['净值日期'], errors='coerce') - pd.Timedelta('1 days')

# pandas日期相减,算出投资期限
df = df['投资结束日'].apply(pd.to_datetime) - df['投资开始日'].apply(pd.to_datetime)
df['投资期限'] = df.apply(lambda x: x.days)

# 如取最新的一百条成立公告(通过创建日期、公告日期排序,取前100条)ascending决定正序倒序
df = df.sort_values(by=['create_time', 'announcement_date'], ascending=False)[:100]

# 将trading_date列转为字符串类型
df['trading_date'] = df['trading_date'].astype(str)
# 取trading_date列中时间大于等于某个日期的行
con1= df['trading_date'] >= xz_start_date
# 取trading_date列中时间小于某个日期的行
con2 = df['trading_date'] < xz_end_date

# 将trading_date、xz_start_date字段转为时间格式,转换失败的填充null
df['trading_date'] = pd.to_datetime(df['trading_date'], errors='coerce')
df['xz_start_date'] = pd.to_datetime(df['xz_start_date'], errors='coerce')
# 取日期列 xz_start_date < trading_date 的表格内容
df=df[df['xz_start_date']<df['trading_date']]

8、去重

# 去重 subset决定通过哪些字段去重 keep表示保留哪一条(first,last是表示第一条或最后一条。而false则表示不保留) inplace表示是否改变源表
paimingdata1.drop_duplicates(subset=['产品id', '报告期', '持仓资产名称', '资产规模', '资产占比'], keep='first',inplace=True)

9、模糊取值

# 取某字段下存在某些字符的df
df = df[df['title'].str.contains('2021年第4季度报告|投资非标资产情况公告')]
即取title列中,值包含‘2021年第4季度报告’或‘投资非标资产情况公告’的表格内容
例:
输入
title	                 date
中国银行2021年第4季度报告	   2020/11/11
中国银行投资非标资产情况公告	2020/11/12
中国银行净值报告	        2020/11/13

输出
title	                 date
中国银行2021年第4季度报告	   2020/11/11
中国银行投资非标资产情况公告	2020/11/12

10、从一个表里删除另一个表某字段已包含的表格

# ~表示取反 即不取 df_A产品全称字段 内包含 df_B产品全称字段值的内容
df_A = df_A[~df_A['产品全称'].isin(df_B['产品全称'])]
语言不好描述,看例子:

输入df_A:
产品全称	      date
工银理财·鑫尊享	2023/3/3
工银理财·全鑫权益	2023/3/4
工银理财·全球臻选	2023/3/5
工银理财·"全鑫权益	 2023/3/6
工银理财·核心优选私银	2023/3/7
工银理财·恒睿睿益	 2023/3/8
工银理财·A	        2023/3/9
工银理财·B	        2023/3/10
工银理财·C	        2023/3/11
工银理财            2023/3/12

输入df_B:
产品全称	      date
工银理财·鑫尊享	2023/3/3
工银理财·全鑫权益	2023/3/4
工银理财·全球臻选	2023/3/5
工银理财·"全鑫权益	 2023/3/6
工银理财·核心优选私银	2023/3/7
工银理财·恒睿睿益	 2023/3/8


输出:
     产品全称     date
6  工银理财·A     2023-03-09
7  工银理财·B     2023-03-10
8  工银理财·C     2023-03-11
9  工银理财       2023-03-12

11、填充、平移

# 向上填充,可选择method = 'bfill‘
# 向下填充,可选择method = 'ffill‘
df['产品名称'] = df['产品名称'].fillna(method='ffill')
df['融资客户名称'] = df['融资客户名称'].fillna(method='ffill')

#-1 向上平移一格
# 1 向下平移一格
df['产品名称_'] = df['产品名称'].shift(-1)
df['融资客户名称_'] =df['融资客户名称'].shift(1)

12、分组填充

# 即 通过'净值日期'和'银行产品编码'分组,上下填充'7日年化收益率'和'万份收益'的值
jzdata2[['7日年化收益率', '万份收益']] = jzdata2.groupby(['净值日期', '银行产品编码'])[['7日年化收益率', '万份收益']].ffill()
jzdata2[['7日年化收益率', '万份收益']] = jzdata2.groupby(['净值日期', '银行产品编码'])[['7日年化收益率', '万份收益']].bfill()

13、循环截取

在这里插入图片描述

当遇到上面这个表格内容的时候,该怎么将这一个表分成4个表呢

# 重置索引
leibie_df = df.reset_index(drop=True)
# 取出 产品全称 所在的所有索引
leibie_df_index = leibie_df[leibie_df.values == '产品全称'].index.values.tolist()
print(leibie_df_index)
# 获取索引数量
len_list = len(leibie_df_index)
num = 0
# 循环索引数量次数(有几个索引就循环几次,即有几个产品全称,就循环几次)
for x in range(len_list):
    num += 1
    # 如果此时循环次数==索引数量-1 即最后一次循环
    if x == len_list - 1:
        # 截取出来的小表格范围为 最后一个产品全称 所在的索引行 到最后
        result_df = df[leibie_df_index[x]:]
    else:
        y = x + 1
        # 截取出来的小表格范围为 一个产品全称 所在的索引行 到 另一个产品全称 所在的索引行
        result_df = df[leibie_df_index[x]:leibie_df_index[y]]
     # 将取出来的小表格重置索引
     result_df=leibie_df1.reset_index(drop=True)

14、其他常用方法

# 取反(剔除)
# 剔除 产品ID值为1256249 并且 净值日期为2020-05-28的数据
df = df[~(df['产品ID'].isin([1256249]) & df['净值日期'].isin(['2020-05-28']))]

# 删除净值日期列是空值的行
df.dropna(subset=['净值日期'], inplace=True)
# 通过取反 剔除'产品全称'里是空值的行
df=df[~df['产品全称'].isin([''])]

# 重置行索引
df = df.reset_index(drop=True)

#重置列索引
df=df.T.reset_index(drop=True).T

# 删除name、age列中,【任一列值为空】的行;
df.dropna(subset=['name', 'age'],
          axis=0, # axis=0表示删除行;
          how='any', # how=any表示若任一列出现空值,就删掉该行
          inplace=True # inplace=True表示在原df上进行修改;
          )
# 删除name、age列中,二者都为空的行。
# 删除都为空的行,还是删除任一列值为空的行,使用参数how来控制
df.dropna(subset=['name', 'age'],
          axis=0,
          how='all', # how='all'表示指定列的值都为空,就删掉该行
          inplace=True)

# 处理重复列名(相同列名,对应值不同,则将列名改名)
column_names = df.columns.values
column_names[2] = 'Changed'
df.columns = column_names
print(column_names)
# 删除重复列名(几列值完全相同)
df = df[df.columns].T.drop_duplicates().T

#处理特殊字符  如\n \r 空格
df = df.applymap((lambda x: "".join(x.split()) if type(x) is str else x))

# 批量模糊匹配剔除
# 剔除'项目名称'字段中包含'', '-', '—', '-', '0', '0.0', '0.00'的数据
df = df[~df['项目名称'].isin(['', '-', '—', '-', '0', '0.0', '0.00'])]

# 修改列名
df = df.rename(columns={'份额净值': '当日账面净值', '日期': '净值日期', '七日年化收益率': '7日年化收益率'})
或
df.rename(columns={'份额净值': '当日账面净值', '日期': '净值日期', '七日年化收益率': '7日年化收益率'},inplace=Ture)

house_info = pd.read_csv('house_info.csv')
1:取行的操作:
house_info.loc[3:6]类似于python的切片操作

2:取列操作:
house_info['price']  这是读取csv文件时默认的第一行索引

3:取两列
house_info[['price','tradetypename']] 取多个列也是同理的,注意里面是一个list的列表,不然会报错误;

4:增加列:
house_Info['adress_new']=list([.....])  跟字典的操作有点类似;

5:对某一列除以他的最大值,这样可以得到一个01的数值范围,也就是一个简易的归一化操作;
house_info['price']/house_info['price'].max()

6:对列进行排序操作:
qianshi_df.sort_values(by=['资产占比排名'], inplace=True, ascending=True) 这里的inplace表示再排序的时候是否生成一个新的dataframe 结构,ascending=true表示升序,默认也是升序;还有一点应该注意的是:对于缺省值,(Nan)排序的时候会把他排在末尾;

7:如何获取缺省值,:
column_null = pd.isnull(column)
column_is_null_true = column[column_null]



# pandas对列求和
import pandas as pd
datas = [
        {'学生': '小红', '语文': None, '数学': 89.5, '英语': 99, '物理':70, 'active': False},
        {'学生': '小明', '语文': 88, '数学': 89.5, '英语': 99, '物理':70, 'active': True},
        {'学生': '小玉', '语文': 78.5, '数学': 79.5, '英语': 92.5, '物理':78, 'active': True},
        {'学生': '小刚', '语文': 60, '数学': 59.5, '英语': 87, '物理':None, 'active': False},
     ]
sum = dict(pd.DataFrame(datas).drop(columns=['学生']).fillna(0).apply(lambda x: round(x.sum(), 2) if all(isinstance(d, (int, float)) and not isinstance(d, bool) for d in x) else ''))
print(sum)
输出:
{'语文': 226.5, '数学': 318.0, '英语': 377.5, '物理': 218.0, 'active': ''}
先将数据转成二维数组,然后排除掉不想求和的列,使用0填充nan值,然后对每一列进行遍历,判断每一个元素是否为intfloat型,并且不为布尔型,然后使用sum函数对列求和。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/777272.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Spring Cloud之Gateway网关应⽤

使⽤⽹关对静态化微服务进⾏代理&#xff08;添加在它的上游&#xff0c;相当于隐藏了具体微服务的信息&#xff0c;对外暴露的是⽹关&#xff09;。 1. 右键⽗⼯程【 yx-parent 】选择【 New 】 - 【 Module 】选项&#xff0c;然后选择创建【 Maven 】类型项⽬&#xff08;不…

以高质量产业载体为底色,绘就珠海高新区产业发展新图景

【作者】珠海高新招商 “珠海高新招商”以招商运营为核心&#xff0c;聚焦珠海工业园区、珠海5.0产业园等招商引资工作&#xff0c;依托专业的招商团队和丰富的创新资源&#xff0c;为企业提供产业园入驻、平台搭建、产业政策咨询、科技服务等全流程专业服务。推动高新区招商引…

17 数组动态初始化

动态初始化&#xff1a;初始化时只指定数组长度&#xff0c;由系统为数组分配初始值。 格式&#xff1a;数据类型[] 数组名 new 数据类型[数组长度] package demo;public class Demo11 {public static void main(String[] args) {// 动态初始化数组&#xff1a;数据类型[] 数…

日撸java三百行day77-80

文章目录 说明GUI1. GUI 总体布局2. GUI 代码理解2.1 对话框相关控件2.1.1 ApplicationShowdown.java&#xff08;关闭应用程序&#xff09;2.1.2 DialogCloser.java&#xff08;关闭对话框&#xff09;2.1.3 ErrorDialog.java&#xff08;显示错误信息&#xff09;2.1.4 HelpD…

深度学习模型量化、剪枝、压缩

fp16是指采用2字节(16位)进行编码存储的一种数据类型&#xff1b; fp32是指采用4字节(32位)&#xff1b; fp16和fp32相比对训练的优化&#xff1a; 1.内存占用减少&#xff1a;应用fp16内存占用比原来更小&#xff0c;可以设置更大的batch_size 2.加速计算&#xff1a;加速…

CentOS5678 repo源 阿里云/腾讯云开源镜像站 repo 地址

CentOS5678 repo 地址 阿里云开源镜像站 https://mirrors.aliyun.com/repo/ CentOS5678 repo 地址 腾讯云开源镜像站 http://mirrors.cloud.tencent.com/repo/ CentOS-5.repo https://mirrors.aliyun.com/repo/Centos-5.repo [base] nameCentOS-$releasever - Base - mirror…

DuDuTalk :做4G智能工牌领域标杆品牌,用语音智能构建完美沟通

数字经济高速发展&#xff0c;AI 成为数字经济时代的核心生产力&#xff0c;驱动数字经济纵深发展&#xff0c;在此情境下&#xff0c;作为AI基石的语音数据价值也在不断释放。企业纷纷加强对客服、营销等服务和销售资源部门的投入&#xff0c;试图从语音数据入手&#xff0c;利…

如何使用windows搭建WebDAV服务,并内网穿透公网访问【无公网IP】

文章目录 windows搭建WebDAV服务&#xff0c;并内网穿透公网访问【无公网IP】1. 安装IIS必要WebDav组件2. 客户端测试3. 使用cpolar内网穿透&#xff0c;将WebDav服务暴露在公网3.1 打开Web-UI管理界面3.2 创建隧道3.3 查看在线隧道列表3.4 浏览器访问测试 4. 安装Raidrive客户…

NodeJS实现支付宝沙箱支付 ②③

文章目录 前言版权声明Alipay SDK 沙箱环境简介Node环境要求沙箱环境配置下载所需模块准备前端静态页面以及Node服务器文件夹规范AlipaySdk 配置准备AlipaySdk 代码演示 Alipay实例化 ~ alipay.sdk 文件 AlipayForm ~ alipayForm文件 AlipayFormStatus ~ alipayForm文件 …

deeplabv3+源码之慢慢解析 第四章network文件夹(1)backbone文件夹(a1)hrnetv2.py--4个函数和可执行代码

系列文章目录&#xff08;更新中&#xff09; 第一章deeplabv3源码之慢慢解析 根目录(1)main.py–get_argparser函数 第一章deeplabv3源码之慢慢解析 根目录(2)main.py–get_dataset函数 第一章deeplabv3源码之慢慢解析 根目录(3)main.py–validate函数 第一章deeplabv3源码之慢…

使用NRF52840 USB Dongle进行Wireshark蓝牙抓包

一、搭建软硬件环境 1.1、准备NRF52840 USB Dongle一个&#xff1a; 1.2、下载Wireshark软件 https://2.na.dl.wireshark.org/win64/Wireshark-win64-4.0.7.exe 1.3、下载Nodic官方解析工具包 nRF Sniffer for Bluetooth LE - Downloads - nordicsemi.com 1.4、下载Python P…

中文数据下载

研究AI离不开数据&#xff0c;数据库可以说是AI的半壁天下。有链接的数据库下载是很nice的。 语音数据集整理 目录 1.Mozilla Common Voice. 2 2.翻译和口语音频的大型数据库Tatoeba. 2 3.VOiCES Dataset 3 4. LibriSpeech. 4 5.2000 HUB5 English&#xff1a;... 4 6.…

Java文件流和网络流的原理以及流解析过程

流我们可以理解为水流&#xff0c;流的传输就相当于在水管里传输&#xff0c;本篇博客主要介绍流的原理和解析过程&#xff0c;学疏才浅&#xff0c;抛砖引玉&#xff0c;大佬勿喷。 文件流 假设我们收到了一个以Unicode编码的文件流&#xff0c;对于该文件流所表示的内容我们…

Java显示日期和时间中间的CST表示什么意思

例如&#xff0c;用Java代码System.out.println(new Date())语句打印出了当前的日期和时间信息&#xff0c;结果显示&#xff1a;Tue Jul 18 18:42:57 CST 2023 package com.thb;import java.util.Date; import java.util.Locale; import java.util.TimeZone;public class Tes…

Office史上最大升级!GPT-4接入Office全家桶!Excel到PPT动嘴就能做!

3月17日&#xff0c;微软宣布将GPT-4融入了Office全家桶。 这意味着&#xff0c;不管是Word、PPT、Excel&#xff0c;还是Outlook、Teams、Microsoft Viva、Power Platform&#xff0c;所有这些办公软件&#xff0c;通通都会得到GPT-4的加持&#xff01; 直接改名吧&#xff0…

this指针/闭包及作用域(进阶)

一.作用域链 1.通过一个例子 let aglobalconsole.log(a);//globalfunction course(){let bjsconsole.log(b);//jssession()function session(){let cthisconsole.log(c);//Windowteacher()//函数提升function teacher(){let dstevenconsole.log(d);//stevenconsole.log(test1,…

Ae 效果:CC Kaleida

风格化/CC Kaleida Stylize/CC Kaleida 万花筒是一种装置或玩具&#xff0c;通过多次反射和镜像&#xff0c;将图像分割成多个对称和重复的图案。CC Kaleida&#xff08;CC 万花筒&#xff09; 效果通过类似的方式在图像上创建镜像和对称的视觉效果。 提示&#xff1a; 由于 CC…

SpringBoot项目中WEB页面放哪里--【JSB系列之008】

SpringBoot系列文章目录 SpringBoot知识范围-学习步骤【JSB系列之000】 文章目录 SpringBoot系列文章目录Resources目录Resources子目录实操一个helloworld!总结作业&#xff08;难度★✰✰✰✰ &#xff09;配套资源题外话 本系列环境 环境win11工具idea 2017jdk1.8数据库my…

AD导入封装以及器件(立创)

这里我们以立创商城为例 https://www.szlcsc.com/?cBD&sdclkidA5f6152zxrDiArD6A52&bd_vid12150450211089112893 1&#xff09;先搜索&#xff0c;然后点击数据手册&#xff1b; ​ 2&#xff09;出现如下界面&#xff0c;点击立即打开&#xff1b; ​ 3&#xff…

前端学习记录~2023.7.17~CSS杂记 Day9 浮动float 定位position 多列布局 响应式设计

前言一、浮动1、使盒子浮动起来2、清除浮动3、清除浮动元素周围的盒子&#xff08;1&#xff09;clearfix 小技巧&#xff08;2&#xff09;使用 overflow&#xff08;3&#xff09;display: flow-root 二、定位1、定位有哪些2、top、bottom、left 和 right3、定位上下文4、介绍…