pandas常用方法

一、提要

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函数对列求和。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

吴恩达机器学习2022-Jupyter-Scikit-Learn教学

1可选实验室: 线性回归使用 Scikit-Learn 有一个开源的、商业上可用的机器学习工具包&#xff0c;叫做 scikit-learn。本工具包包含您将在本课程中使用的许多算法的实现。 1.1目标 在这个实验室里: 利用 scikit-学习使用线性回归梯度下降法来实现 1.2工具 您将利用 sciki…

自动化用例编写思路 (使用pytest编写一个测试脚本)

目录 一&#xff0c;明确测试对象 二&#xff0c;编写测试用例 构造请求数据 封装测试代码 断言设置 三&#xff0c;执行脚本获取测试结果 四&#xff0c;总结 经过之前的学习铺垫&#xff0c;我们尝试着利用pytest框架编写一条接口自动化测试用例&#xff0c;来厘清接口…

postgreSQL数据库的安装

文章目录 一、Linux 下安装 postgreSQL 数据库1.1、准备环境1.2、关闭防火墙跟SELinux1.2.1、关闭防火墙 firewalld1.2.2、关闭SELinux 1.3、挂载本地镜像1.4、软件包的下载postgreSQL 一、Linux 下安装 postgreSQL 数据库 1.1、准备环境 操作系统IP应用Red Hat 8192.168.192…

ConfigMap 补充 和 Secret

对于上一篇文章我们分享了为什么要使用 ConfigMap &#xff0c;我们创建 ConfigMap 的时候可以传入单个或者多个键值对&#xff0c;也可以传入文件&#xff0c;还分享了如何简单的传入 ConfigMap 里面的数据作为环境变量 我们补充一下使用 ConfigMap 一次性传递多个条目吧 一…

【监控系统】Prometheus监控组件Node-Exporter配置实战

这一节&#xff0c;我们来配置一下Node-Exporter&#xff0c;那么我们先来了解一下什么是Prometheus的Exporter&#xff1f; 任何向Prometheus提供监控样本数据的程序都可以被称为一个Exporter&#xff0c;它是一种用于将不同数据源的指标提供给Prometheus进行收集和监控的工具…

缓存淘汰策略

LRU 与 LFU 缓存策略及其实现。 应用层缓存 鉴于磁盘和内存读写的差异性&#xff0c;DB 中低频写、高频读的数据适合放入内存中&#xff0c;直接供应用层读写。在项目中读取用户资料时就使用到了 LRU&#xff0c;而非放到 Redis 中。 缓存的 2 个基本实现 Set(key string, v…

ios 通过xib自定义控件

通过xib自定义控件 xib和stroyboayd对比 共同点&#xff1a; 都是用来描述软件界面 都是用interface Builder工具来编辑 本质都是转换成代码去创建控件 不同点&#xff1a; xib是轻量级的&#xff0c;用来描述局部ui界面 创建模型文件 XMGCar 自定义控件 xib 图形设计 …

mac批量提取图片文件名到excel?

mac批量提取图片文件名到excel&#xff1f;最近有个小伙伴向我求助一个电脑操作上的问题&#xff0c;问我在Mac电脑上用什么方法可以快速批量的将大量图片的名称一次性提取出来&#xff0c;并且保存到excel表格里。记得小编曾经给大家分享过windows电脑上批量提取文件名称的方法…

爱心代码李峋同款爱心 python html

目录 前言 一、python 1.python 第一个 2.python第二个 二、HTML 1.第一个 2.第二个html 3.第三个html 3.第四个html 总结 前言 最近那个电视剧很火&#xff0c;就是搞爱心代码的&#xff0c;本人兴趣使然&#xff0c;在网上搜集了一些代码&#xff0c;经过一定修改&…

【iOS】—— 编译链接

【iOS】—— 编译链接 文章目录 【iOS】—— 编译链接编译流程预处理&#xff08;预编译Prepressing&#xff09;编译&#xff08;Compilation&#xff09;汇编&#xff08;Assembly&#xff09;链接&#xff08;Linking&#xff09; 编译流程 编译流程分为四步 预处理&#…

python 安装、配置、使用 xlrd模块、numpy模块

目录 一、xlrd模块 &#xff08;一&#xff09;安装xlrd模块 &#xff08;二&#xff09; pycharm 配置xlrd &#xff08;三&#xff09; 读取xls格式 &#xff08;四&#xff09;xlrd读取时间日期时&#xff0c;会是float类型&#xff0c;需要转换。 二、numpy模块 (一)n…

基于linux下的高并发服务器开发(第一章)- Linux系统IO函数

05 / Linux系统IO函数 &#xff08;1&#xff09;man 2 open >>打开一个已经存在的文件 int open(const char *pathname, int flags); 参数&#xff1a; pathname:要打开文件路径 - flags:对文件的操作权限设置还有其他的设置 O_RDONLY,O_WRONLY,O_RDWR 这三个设置是互斥…

数据结构——各种常见算法的实现方法和思路

文章目录 常见的排序算法类型复杂度和稳定性 1.冒泡排序2.直接插入排序3.希尔排序4.简单选择排序方法1&#xff1a;双向遍历选择排序方法2&#xff1a;单向遍历选择排序 5.归并排序方法1&#xff1a;递归方法2&#xff1a;非递归 6.快速排序方法1&#xff1a;随机取keyi方法2&a…

leetcode 17. 电话号码的字母组合

2023.7.18 该题也是经典回溯题。 与之前做的组合有两点不同&#xff1a; 之前的组合题是求同一集合的组合&#xff0c;而本题是求不同集合的组合。本题还需要有一个将字符串数字转换为手机号9键对应字符集的过程。 下面上代码&#xff1a; class Solution { public:string le…

C# 连接mysql数据库报错:Character set ‘utf8mb3‘ is not supported by .Net Framework.

最近项目突然连接mysql数据库出现一个bug&#xff0c;排查了半小时&#xff0c;最后更新MySql.Data版本解决了&#xff0c;错误信息如下&#xff1a; System.NotSupportedException: Character set utf8mb3 is not supported by .Net Framework.在 MySql.Data.MySqlClient.Cha…

学习PostgreSQL的优势

学习 PostgreSQL 可以为您打开许多就业机会。 PostgreSQL 是一种强大的关系型数据库管理系统&#xff0c;被广泛用于企业和组织中的数据管理和应用程序开发。 以下是一些学习 PostgreSQL 可能帮助您找到的工作领域&#xff1a; **1.数据库管理员&#xff1a;**作为 PostgreSQ…

element 文件批量上传展示上传结果、失败重新上传

效果图&#xff1a; 不废话了&#xff0c;直接上代码&#xff01;&#xff01;&#xff01; HTML部分&#xff1a; <template><div class"container"><el-uploadclass"upload-demo"accept".jpg,.JPG,.png,.PNG"action"#&q…

浅谈物联网在电力行业的应用

摘要&#xff1a;随着社会经济的快速发展&#xff0c;物联网技术也在各个行业中得到了广泛的应用&#xff0c;特别是在电力行业中应用物联网技术&#xff0c;也有效的促进了电力行业的现代化发展。而物联网与智能电网同样都是当代重要的高新技术以及新兴产业。所以通过对于物联…

【论文阅读】《Distilling the Knowledge in a Neural Network》

【论文阅读】《Distilling the Knowledge in a Neural Network》 推荐指数&#xff1a; 1. 动机 &#xff08;1&#xff09;虽然一个ensemble的模型可以提升模型的效果&#xff0c;但是在效率方面实在难以接受&#xff0c;尤其是在每个模型都是一个大型的网络模型的时候。 &…

共筑开源新长城 龙蜥社区走进开放原子校源行-清华大学站

6 月 28 日&#xff0c;以“聚缘于校&#xff0c;开源共行”为主题的 2023 年开放原子校源行活动在清华大学成功举行。本次活动由开放原子开源基金会和清华大学共同主办&#xff0c;来自各行业的 22 位大咖共聚校园共话开源。龙蜥社区技术专家边子政受邀进行技术分享&#xff0…