python中的数据分析(juypter)

加载数据后的套路

df.head()
df.info()
df.describe()

选择部分数据

df[[要选中的列名的列表]]
df.loc[,]
df.iloc[,]
df.query()

增加

df[新列名] = [新值]
df.insert(loc , column,value =)

删除

df.drop()
df.drop_duplicates()

axis =0 可以改成1

inplace

修改数据

df.iloc[0,0] = 10
def func(x):return x
s.apply(func) # 自定义处理,当修改的逻辑比较复杂的时候
df.apply(func ,axis = )
df.replace(to_replace = ,value=)

修改表结构

index

df.set_index() # 把df中一列数据变成行索引
df.reset_index() # 重置索引, 当前的索引会变成数据中的一列, 会添加一个从0开始计数的整数索引
df.rename(index = {},columns={})
df.columns = []
df.index = []

df.replace/df.rename 共同的特点, 老的值没找到, 不会报错, 正常执行, 不会改值

df.insert 是修改数据的API中, 没有inplace 参数的一个 , 直接在原来数据上进行修改

s.value_counts()

s.unique()

s.sort_values()

1 常用排序和统计函数

1 排序

sort_values()

# by 指定排序的字段  可以传入列表,做多字段排序, 比如下面的例子, 当价格相同的时候, 价格相同的数据再按面积排序
# ascending 也可以传入列表,长度更by 的列表相同, 多字段排序的时候, 每个字段是升序还是降序排可以手动指定
df.sort_values(by=['价格','面积'],ascending=False)

nlargest()

nsmallest()

df.nlargest(5,columns=['价格'])  # 价格 n个最大的
df.nsmallest(5,columns=['价格'])  # n个最小的

2 统计函数

df.corr() 计算相关性, 判断两列数据是否同增同减

  • 如果两列变量 一个增加, 另外一个也增加, 一个减少另外一个也减少, 说明他们之间具备正相关性 , 计算出来的相关系数>0 相关系数>0.7 强相关 0.3~0.7 之间 具有相关性 <0.3 相关性比较弱

  • 如果两列变量 一个增加, 另外一个减少, 一个减少另外一个增加, 说明他们之间具备负相关性

相关性的应用场景

  • 用来判断不同数据之间是否有关联, 如果两列数据相关性比较强, 说明他们之间可能具有因果关系

  • 在数据分析过程中, 归因分析是比较重要的, 做归因可以从计算相关性开始进行分析

  • 相关不等于因果

df.min() 最小 df.max() 最大 df.mean() 平均 df.std() 标准差 df.sum() 求和

  • 计算这些统计量的时候, 如果df中又多列数值型的数据, 既可以按行计算, 也可以按列计算, 通过传入0,1来进行控制

2 缺失值处理

2.1 认识缺失值, Pandas如何表示缺失值

from numpy import NaN,NAN,nan

Nan 是一个特殊的float类型的数据, 它和任何值都不相等

2.2 加载数据后, 如何判断缺失值数量

pd.read_csv('C:/Develop/顺义48/day01/02_代码/data/city_day.csv',keep_default_na=True,na_values='Ahmedabad')
# keep_default_na 默认是True 数据中有空值会加载成NaN  如果改成False 空值就是空白内容  
# na_values='Ahmedabad' 可以指定 哪些值可以作为缺失值处理

如果没有特殊需求, 正常加载数据, 缺失会被加载成NAN

df.isnull() # 是空值 返回True 不是返回False
df.notnull()  # 不是空值 返回True 是返回False

计算每一列缺失值的数量

df.isnull().sum()

2.3 缺失值的处理

删除缺失值
  • 使用dropna函数来删除空值,具体用法如下

    # 函数用法
    df.dropna(    axis=0,     how='any',     inplace=True,     subset=['列名',...],    thresh=10
    )df.drop() # 按列删除
    
  • dropna函数参数解释

    • axis=0

      • 可选参数 ,默认为0按行删

      • 0, or 'index':删除包含缺失值的行

      • 1, or 'columns':删除包含缺失值的列

    • how='any'

      • 可选参数,默认为any

      • any: 如果存在NA值,则删除该行或列

      • all: 如果所有值都是NA,则删除该行或列

    • inplace=False

      • 可选参数,不建议使用这个参数

      • 默认False, 不对原数据集进行修改

      • inplce=True,对原数据集进行修改

    • subset接收一个列表

      • 接收一个列表,列表中的元素为列名: 对特定的列进行缺失值删除处理

    • thresh=n

      • 可选参数

      • 参数值为int类型,按行去除NaN值,去除NaN值后该行剩余数值的数量(列数)大于等于n,便保留这一行

缺失值填充

非时序数据

  • 考虑用默认值填充

  • 使用统计量进行填充 均值, 中位数,众数

pm25_mean = df2['PM2.5'].mean()
df2['PM2.5'].fillna(pm25_mean)

时序数据

  • 天气数据,股票的数据

  • 跟时间相关, 前一个数据和后一个数据有一定关系

时序数据填充可以考虑用前一个非空值, 后一个非空值填充,可以使用线性插值

s1 = df['Xylene'][54:64]s1.fillna(method='ffill')s1.fillna(method='bfill')s1.interpolate()

3 数据类型转换

3.1 数值型和字符串之间的转换

astype()

pd.to_numeric()

import pandas as pd
df = pd.read_csv('C:/Develop/顺义48/day01/02_代码/data/city_day.csv')
df['PM2.5'] = df['PM2.5'].astype(object)
df2 = df.head().copy()
# 创造包含'missing'为缺失值的数据,批量替换第1、3、5行中NO列的值为字符串'missing'
df2.loc[::2, 'NO'] = 'missing'
df2.info()
df2['NO'].astype(float)

ValueError: could not convert string to float: 'missing'

如果一列数据中, 有数值类型,也有字符串, astype转换为数值会报错,此时可以使用to_numeric()方法, 可以把字符串转换成空值

pd.to_numeric(df2['NO'],errors='coerce')

3.2 日期时间类型

datetime64 [ns]

  • 日期事件类型的列, 加载之后, 可以转换成日期事件类型, 就是datetime64[ns]

pd.to_datetime()
  • 也可以在加载的时候直接指定日期列, 直接加载成日期时间类型

pd.read_csv('',parse_dates = [日期列名])

Timestamp 时间戳

  • pd.to_datetime('时间点')

timedelta64 时间差值

两个时间相减

使用的时候需要注意, 如果一列数据 Series 是datetime64 、 timedelta64 的时候, 获取时间维度的相关属性需要通过

s.dt.XXX 来获取

print(df['Date'].dt.year) # 获取年
print(df['Date'].dt.month) # 月
print(df['Date'].dt.day) # 日
df['Date'].dt.quarter # 季度
s_time_delta = df['Date']-df['Date'].min()
s_time_delta.dt.days

datetime类型和timedelta类型都可以作为索引

  • 好处, 方便按照时间维度筛选数据

  • 方便按照时间维度进行切片操作

# Data 是日期时间类型列,  set_index 设置成行索引
df.set_index('Date', inplace=True)
# 在切片、按时间维度筛选数据之前, 先对日期时间索引排序
df = df.sort_index() # 对索引进行排序
df.loc['2018']
df.loc['2018-01-01']
df.loc['2018-02-01 22':'2018-02-02 23:59:59']

DatetimeIndex 类型 日期时间索引

计算两列日期数据的差值, 得到timedelta类型的Series可以把它设置为index 索引, 得到的是 TimedeltaIndex

df2 = df.query('City == "Delhi"')
df2.index = df2['Date']-df2['Date'].min()
df2.index
df2['3 days':'4 days']

4 分组聚合

df.grouppy([分组字段], as_index= )['聚合字段'].聚合方法()

df.grouppy([分组字段], as_index= )['聚合字段'].agg(['聚合方法名'])

df.grouppy([分组字段], as_index= ).agg({‘聚合字段名’:'聚合方法名','聚合字段名’:'聚合方法名'})

  • 分组字段,可以有1个多个, 默认分组的字段在分组的结果中会作为行索引, 如果设置了as_index = False ,分组字段会作为结果的列数据, 会使用从0开始的整数索引

  • 聚合字段可以有1个多个, 可以通过agg来指定不同的字段, 使用不同的聚合方式

  • 多个字段分组, 多个字段聚合, 得到的结果 MultiIndex 通过MultiIndex 做数据筛选, 传入的是元组

import pandas as pd
df = pd.read_csv('C:/Develop/顺义48/day01/02_代码/data/LJdata.csv')
#%%
df.groupby(['区域']).mean()
# FutureWarning 未来版本变化的提示, python 包版本升级之后, 可能一些方法, 或参数直接就变了, 或者删掉了
# 看到提示之后, 需要注意, 当前这份代码, pandas的版本不要升级
# python项目开发好之后, 开发时候用到的软件包, 不要升级print(df.groupby('区域')['价格'].mean())
print(df.groupby('区域')[['价格']].mean())
df.groupby('区域')[['价格','面积']].mean()
print(df.groupby('区域')[['价格','面积']].agg(['mean','max']))
df_result= df.groupby('区域')[['价格','面积']].agg(['mean','max'])
df_result.columns
# MultiIndex([('价格', 'mean'),
#             ('价格',  'max'),
#             ('面积', 'mean'),
#             ('面积',  'max')],
#            )print(df_result[[('价格', 'mean'),('价格',  'max')]])df.groupby('区域').agg({'价格':'mean','面积':'max'})df_result2 = df.groupby(['区域','户型']).agg({'价格':'mean','面积':'max'})df_result2.index # 查看索引 当前对两个字段进行分组, 得到的是MultiIndexdf_result2.reset_index() # 重置索引df.groupby(['区域','户型'],as_index=False).agg({'价格':'mean','面积':'max'})

DataFrameGroupby对象 (了解)

df.groupby('区域')['价格'].mean()

  • df.groupby('区域') → 对象 DataFrameGroupby

  • df_gb = df.groupby('区域')
    df_gb.groups # 可以获取所有的分组 {'区域取值':[当前取值在数据中的行索引]}
    df_gb.get_group('区域取值') → 这一组对应的DataFrame数据
    
  • df.groupby('区域')['价格'] → 对象 SeriesGroupby

自定义聚合函数

  • df.groupby('分组字段')['聚合字段'].agg(自定义聚合函数对象)

## 自定义聚合函数
def my_mean(x):print(x)print('=====')return x.sum()/len(x)
df.groupby('区域')['价格'].agg(my_mean)

5 数据分组(分箱) pd.cut

使用场景:

  • 把年龄划分成少年, 青年, 中年, 老年

  • 收入划分成, 低收入, 中收入, 高收入 。。

  • 价格 便宜, 中等, 贵

# 等距 每一组 边界差距, 尽量均匀
pd.cut(df['价格'],bins = 3) # bins 传入要分几组
# 可以自定义分组的边界
pd.cut(df['价格'],bins = [0,3000,8500,210000],labels=['便宜','中等','贵'])
# bins 默认区间是左开右闭合 (0,3000]  (3000,8500], (8500,210000] 需要注意最小的区间要比数据中的最小值小一些
# labels 可以指定分组之后, 每一组的名字,如果不指定默认使用的就是分组的边界的取值

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

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

相关文章

解决el-table表格拖拽后,只改变了数据,表头没变的问题

先看看是不是你想要解决的问题 拖拽后表头不变的bug修复 这个问题一般是使用v-for对column的数据进行循环的时候&#xff0c;key值绑定的是个index导致的&#xff0c;请看我上篇文章&#xff1a;eleplus对el-table表格进行拖拽(使用sortablejs进行列拖拽和行拖拽)&#xff1a;-…

FastAPI操作关系型数据库

FastAPI可以和任何数据库和任意样式的库配合使用&#xff0c;这里看一下使用SQLAlchemy的示例。下面的示例很容易的调整为PostgreSQL&#xff0c;MySQL&#xff0c;SQLite&#xff0c;Oracle等。当前示例中我们使用SQLite ORM对象关系映射 FastAPI可以与任何数据库在任何样式…

eFuse电子保险丝,需要了解的技术干货来啦

热保险丝作为一种基本的电路保护器件&#xff0c;已经成功使用了150多年。热保险丝有效可靠、易用&#xff0c;具有各种不同的数值和版本&#xff0c;能够满足不同的设计目标。然而&#xff0c;对于寻求以极快的速度切断电流的设计人员来说&#xff0c;热保险丝不可避免的缺点就…

联邦学习论文阅读:2018 Federated learning with non-IID data

介绍 这是一篇2018年挂在arXiv上的文章&#xff0c;是一篇针对FL中数据Non-IID的工作。 作者发现&#xff0c;对于高度Non-IID的数据集&#xff0c;FedAvg的准确性下降了55%。 作者提出了可以用权重散度&#xff08;weight divergence&#xff09;来解释这种性能下降&#xff…

Redis跳表

Redis跳表 跳表是一种有序数据结构&#xff0c;它通过在每个节点维持多个指向其他节点的指针&#xff0c;从而达到快速访问节点的目的 跳表支持平均O&#xff08;logN&#xff09;&#xff0c;最坏O&#xff08;N&#xff09;复杂度的节点查找&#xff0c;还可以通过顺序性操作…

【SCAU数据挖掘】数据挖掘期末总复习题库简答题及解析——上

1.K-Means 假定我们对A、B、C、D四个样品分别测量两个变量&#xff0c;得到的结果见下表。 样品 变量 X1X2 A 5 3 B -1 1 C 1 -2 D -3 -2 利用K-Means方法将以上的样品聚成两类。为了实施均值法(K-Means)聚类&#xff0c;首先将这些样品随意分成两类(A、B)和(C、…

【星海随笔】ELK优化

ELS 再遇到大的日志文件的时候不会自动进行清理的,我们可以通过 logrotate 转储工具进行操作。 该命令是基于 Cron 实现,由系统执行,当然也可以手动进行执行例如 logrotate -f configfile# more /etc/logrotate.confweekly // 默认每一周执行一次rotate轮转工作 r…

打造专属 Switch 模拟游戏机

文章目录 2种方案Switch版RetroArchLakka系统 整体性能对比&#xff1a;Lakka更优核心是否兼容&#xff1a;并不兼容整合2种方案&#xff1a;共享游戏ROM和配置、资源等文件夹存储空间优化添加模拟器核心Switch版RetroArchLakka 添加游戏添加特殊类型模拟游戏示例&#xff08;尤…

msf原生shellcode迁移进程后如何获取攻击者ip

msf原生shellcode迁移进程后如何获取攻击者ip仅为ip及端口 木有图&#xff0c;看一下就晓得了 偶尔看到了这个问题&#xff0c;做了一些倒推测试之后得出来的结果 倒推过程 shellcode msf生成一段shellcode&#xff0c;产生的一组16进制数据 msfvenmon -p windows/meterpret…

Ubuntu下使用`sysbench`来测试CPU性能

使用 sysbench 来测试 CPU 性能是一个常见的方法。sysbench 是一个模块化的跨平台基准测试工具&#xff0c;常用于评估系统的各个组件&#xff08;例如 CPU、内存、I/O 子系统等&#xff09;的性能。 下面是如何使用 sysbench 来测试 CPU 性能的基本步骤&#xff1a; 1. 安装…

车载电子电气架构 - 智能座舱技术及功能应用

我是穿拖鞋的汉子,魔都中坚持长期主义的汽车电子工程师。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 屏蔽力是信息过载时代一个人的特殊竞争力,任何消耗你的人和事,多看一眼都是你的不对。非必要不费力证明自己,无利益不试图说服别人,是精神上的节…

论文解读——《I2EDL: Interactive Instruction Error Detection and Localization》

一、研究背景 视觉与语言导航&#xff08;VLN&#xff09;是一个AI领域的研究任务&#xff0c;旨在开发能够按照自然语言指令在三维空间中导航到指定位置的智能体。这项任务与人类的日常活动——如按照口头指示到达某个地点——十分相似&#xff0c;对于推动人机交互的自然性和…

【学习笔记9】一些遇到的如何写code的问题

一、计算e(x)&#xff1a; import math result math.exp(x)import numpy as np result np.exp(x)二、matplotlib.pyplot坐标无法显示中文&#xff1a; plt.rcParams[font.family] [sans-serif] plt.rcParams[font.sans-serif] [SimHei]三、matplotlib.pyplot横纵坐标无法…

【智能算法应用】基于混合粒子群-蚁群算法的多机器人多点送餐路径规划问题

目录 1.算法原理2.数学模型3.结果展示4.参考文献5.代码获取 1.算法原理 【智能算法】粒子群算法&#xff08;PSO&#xff09;原理及实现 配餐顺序&#xff1a; 采用混合粒子群算法 || 路径规划&#xff1a; 采用蚁群算法 2.数学模型 餐厅送餐多机器人多点配送路径规划&…

配置应用程序的服务和请求处理管道 为啥要在starup而不再program中配置呢

配置应用程序的服务和请求处理管道通常在Startup类中完成&#xff0c;而不是在Program类中&#xff0c;主要基于以下原因&#xff1a; 关注点分离&#xff1a; Program.cs主要关注于应用程序的启动和宿主的构建。它负责初始化应用程序的主机&#xff0c;并设置基本的配置和启动…

linux系统——wget命令

wget命令可以用于下载指定的url地址文件&#xff0c;支持断点续传&#xff0c;支持ftp&#xff0c;http协议下载&#xff0c;在下载普通文件时&#xff0c;即使网络出现故障&#xff0c;依然会不断尝试下载 wget命令直接加url地址 使用-o参数可以将下载文件改名&#xff0c;-c…

【AI】DeepStream(11):deepstream-app源码详解(03)解析配置文件

【AI】AI学习目录汇总 上一篇:【AI】DeepStream(10):deepstream-app源码详解(02)配置文件格式详解 1、简述 deepstream-app的 txt 配置文件,为INI格式,使用 GLib 的 GKeyFile 来解析INI格式的配置文件。 2、解析 application 2.1 配置参数 [application] // 性能测…

python 循环导入(circular imports)解决方法

在 Python 中&#xff0c;大部分人都应该都遇到过循环导入的问题。 循环导入是指两个文件各自尝试导入另一个文件&#xff08;模块&#xff09;&#xff0c;当一个模块没有完全初始化时会导致失败。解决这种情况的最好方法是将代码分层组织&#xff0c;这样导入的关系就会自然…

Java基础 - 多线程

多线程 创建新线程 实例化一个Thread实例&#xff0c;然后调用它的start()方法 Thread t new Thread(); t.start(); // 启动新线程从Thread派生一个自定义类&#xff0c;然后覆写run()方法&#xff1a; public class Main {public static void main(String[] args) {Threa…

AXI Quad SPI IP核中的STARTUPEn原语参数

启动STARTUPEn Primitive &#xff08;原语&#xff09;参数在 FPGA的主 SPI模式下非常有用。当你启用这个参数时&#xff0c;对于 7 系列设备&#xff0c;STARTUPE2 原语会被包含在设计中&#xff1b;而对于 UltraScale™ 设备&#xff0c;则是 STARTUPE3 原语。这些原语在 FP…