python - Pandas缺失值处理

文中所用数据集已上传,找不到的可以私聊我

学习目标

  • 知道空值和缺失值的区别以及缺失值的影响

  • 知道如何查看数据集缺失值情况的方法

  • 知道缺失值处理的办法

1 NaN简介

好多数据集都含缺失数据。缺失数据有多种表现形式

  • 数据库中,缺失数据表示为NULL

  • 在某些编程语言中用NANone表示

  • 缺失值也可能是空字符串''或数值 0

  • 在Pandas中使用NaN表示缺失值

    • Pandas中的NaN值来自NumPy库,NumPy中缺失值有几种表示形式:NaN,NAN,nan,他们都一样

  • 缺失值和其它类型的数据不同,它毫无意义,NaN不等于0,也不等于空字符串

    from numpy import NaN,NAN,nan
    print(NaN==True)
    print(NaN==False)
    print(NaN==0)
    print(NaN=='')
    print(NaN==None)
    ​
    # 输出结果如下
    False
    False
    False
    False
    False
  • 两个NaN也不相等

    print(NaN==NaN)
    print(NaN==nan)
    print(NaN==NAN)
    print(nan==NAN)
    ​
    # 输出结果如下
    False
    False
    False
    False
  • 缺失值从何而来呢?缺失值的来源有两个:

    • 原始数据包含缺失值

    • 数据整理过程中产生缺失值

2 加载包含缺失的数据

加载数据时可以通过keep_default_nana_values 指定加载数据时的缺失值

  • df = pd.read_csv('../data/city_day.csv')
    print(df.head())
    ​
    # 输出结果如下
            City        Date  PM2.5  PM10  ...  Toluene  Xylene  AQI  AQI_Bucket
    0  Ahmedabad  2015-01-01    NaN   NaN  ...     0.02    0.00  NaN         NaN
    1  Ahmedabad  2015-01-02    NaN   NaN  ...     5.50    3.77  NaN         NaN
    2  Ahmedabad  2015-01-03    NaN   NaN  ...    16.40    2.25  NaN         NaN
    3  Ahmedabad  2015-01-04    NaN   NaN  ...    10.14    1.00  NaN         NaN
    4  Ahmedabad  2015-01-05    NaN   NaN  ...    18.89    2.78  NaN         NaN
    ​
    [5 rows x 16 columns]

    加载数据,观察缺失值默认的显示情况

    df = pd.read_csv('../data/city_day.csv')
    print(df.head())
    ​
    # 输出结果如下
            City        Date  PM2.5  PM10  ...  Toluene  Xylene  AQI  AQI_Bucket
    0  Ahmedabad  2015-01-01    NaN   NaN  ...     0.02    0.00  NaN         NaN
    1  Ahmedabad  2015-01-02    NaN   NaN  ...     5.50    3.77  NaN         NaN
    2  Ahmedabad  2015-01-03    NaN   NaN  ...    16.40    2.25  NaN         NaN
    3  Ahmedabad  2015-01-04    NaN   NaN  ...    10.14    1.00  NaN         NaN
    4  Ahmedabad  2015-01-05    NaN   NaN  ...    18.89    2.78  NaN         NaN
    ​
    [5 rows x 16 columns]
  • 使用keep_default_na=False参数加载数据,不显示默认缺失值

    df = pd.read_csv('../data/city_day.csv', keep_default_na=False)
    print(df.head())
    ​
    # 输出结果如下
            City        Date PM2.5 PM10    NO  ... Benzene Toluene Xylene AQI AQI_Bucket
    0  Ahmedabad  2015-01-01             0.92  ...     0.0    0.02    0.0               
    1  Ahmedabad  2015-01-02             0.97  ...    3.68     5.5   3.77               
    2  Ahmedabad  2015-01-03             17.4  ...     6.8    16.4   2.25               
    3  Ahmedabad  2015-01-04              1.7  ...    4.43   10.14    1.0               
    4  Ahmedabad  2015-01-05             22.1  ...    7.01   18.89   2.78               
    ​
    [5 rows x 16 columns]
  • 使用na_values参数加载数据,通过该参数指定我们认为的缺失值

    # 在这里我们通过na_values参数,指鹿为马
    # 比如我们认为你的值是Ahmedabad,则也是缺失,这些值会被替换成NaN
    df = pd.read_csv('../data/city_day.csv', na_values=["Ahmedabad"], keep_default_na=True)
    print(df.head())
    ​
    # 输出结果如下
      City        Date PM2.5 PM10    NO  ... Benzene Toluene Xylene AQI AQI_Bucket
    0  NaN  2015-01-01             0.92  ...     0.0    0.02    0.0               
    1  NaN  2015-01-02             0.97  ...    3.68     5.5   3.77               
    2  NaN  2015-01-03             17.4  ...     6.8    16.4   2.25               
    3  NaN  2015-01-04              1.7  ...    4.43   10.14    1.0               
    4  NaN  2015-01-05             22.1  ...    7.01   18.89   2.78               
    ​
    [5 rows x 16 columns]

3 查看缺失值

3.1 加载数据并通过info函数初步查看缺失值情况

  • 加载印度城市空气质量数据集,并初步查探缺失值

    df = pd.read_csv('../data/city_day.csv')
    df.info()
    ​
    # 输出结果如下
    <class 'pandas.core.frame.DataFrame'>
    RangeIndex: 29531 entries, 0 to 29530  # 总的行数是:29531
    Data columns (total 16 columns):
     #   Column      Non-Null Count  Dtype  
    ---  ------      --------------  -----  
     0   City        29531 non-null  object   # 非空的行数是29531行,也就是一行也不空
     1   Date        29531 non-null  object 
     2   PM2.5       24933 non-null  float64
     3   PM10        18391 non-null  float64
     4   NO          25949 non-null  float64
     5   NO2         25946 non-null  float64
     6   NOx         25346 non-null  float64
     7   NH3         19203 non-null  float64
     8   CO          27472 non-null  float64
     9   SO2         25677 non-null  float64
     10  O3          25509 non-null  float64
     11  Benzene     23908 non-null  float64
     12  Toluene     21490 non-null  float64
     13  Xylene      11422 non-null  float64  # 非空的行数是11422行,也就是有一多半都是空值
     14  AQI         24850 non-null  float64
     15  AQI_Bucket  24850 non-null  object 
    dtypes: float64(13), object(3)
    memory usage: 3.6+ MB

3.2 isnull函数和notnull函数判断是否存在缺失值

  • pd.isnullpd.isna用法相同

    # 判断是否为缺失值
    # 如果值是缺失值返回True,否则返回False
    print(df.head().isnull())
    print(df['PM2.5'].head().isna())
    notnull函数和notna函数相同,判断是否存在非缺失值;与isnull函数对应,返回结果正好相反# 判
    断是否为非缺失值
    # 缺失值返回False
    print(df.head().notnull())
    print(df['PM2.5'].head().notna())
    ​
    # 输出结果如下
       City  Date  PM2.5   PM10    NO  ...  Benzene  Toluene  Xylene    AQI  AQI_Bucket
    0  True  True  False  False  True  ...     True     True    True  False       False
    1  True  True  False  False  True  ...     True     True    True  False       False
    2  True  True  False  False  True  ...     True     True    True  False       False
    3  True  True  False  False  True  ...     True     True    True  False       False
    4  True  True  False  False  True  ...     True     True    True  False       False
    ​
    [5 rows x 16 columns]
    0    False
    1    False
    2    False
    3    False
    4    False
    Name: PM2.5, dtype: bool

3.3 df.isnull().sum()空值数量统计

# 缺失值数量统计
print(df.isnull().sum())
print(df['PM2.5'].isnull().sum())
# 非缺失值数量统计
print(df.notnull().sum())
print(df['PM2.5'].notnull().sum())
​
# 输出结果如下
City              0
Date              0
PM2.5          4598
PM10          11140
NO             3582
NO2            3585
NOx            4185
NH3           10328
CO             2059
SO2            3854
O3             4022
Benzene        5623
Toluene        8041
Xylene        18109
AQI            4681
AQI_Bucket     4681
dtype: int64
4598
City          29531
Date          29531
PM2.5         24933
PM10          18391
NO            25949
NO2           25946
NOx           25346
NH3           19203
CO            27472
SO2           25677
O3            25509
Benzene       23908
Toluene       21490
Xylene        11422
AQI           24850
AQI_Bucket    24850
dtype: int64
24933

3.4 Missingno库对缺失值的情况进行可视化探查

可以使用第三方库Missingno来对缺失值进行可视化

3.4.1 安装missingno库
  • 通过pip安装missingno

    pip install missingno -i https://pypi.tuna.tsinghua.edu.cn/simple/
3.4.2 missingno.bar(df)缺失值数量可视化
  • 导包并利用missingno.bar(df)函数查看数据集数据完整性

    import pandas as pd
    import missingno as msno
    import matplotlib.pyplot as plt
    ​
    # 加载数据集
    df = pd.read_csv('../data/city_day.csv')
    # 查看非缺失值数量
    print(df.notna().sum())
    # 可视化查看缺失值数量情况
    msno.bar(df)  # 查看图表
     # 在有些平台,不加该语句,以上的图表不能显示,如果上边的msno.bar(df)可以显示图表,也可以不加该语句
    plt.show()   
3.4.3 missingno.matrix(df)缺失值位置的可视化
  • missingno.matrix(df)` 可以快速直观的查看缺失值的分布情况

    print(msno.matrix(df))
    # 对数据集进行随机取样后再查看数据缺失情况
    print(msno.matrix(df.sample(100)))
    plt.show()
  • 有缺失值的地方,图都显示为空白。 例如,在City列中没有白线,说明该列无缺失值。

  • 右侧的迷你图给出了数据完整性的情况,表示每行数据非空值的多少,其中的数字1表示该行数据只有1列为非空,数字15表示该行数据有15列为非空数据,显示的1和15为整个数据集所有数据行中非空值的最小值和最大值

2.4.4 missingno.heatmap(df)缺失值之间相关性可视化
print(msno.heatmap(df))
plt.show()
  • 相关性取值 0 不相关,1强相关,-1强负相关

4 缺失值处理

缺失值的处理方法有以下几种方式:

  • 删除缺失值:删除缺失值会损失信息,并不推荐删除,当缺失数据占比较高的时候,或可以忽略相关性时,可以尝试使用删除缺失值

  • 填充缺失值:填充缺失值是指用一个估算的值来去替代缺失数

    • 平均值、中位数

    • 前后值填充,数据呈现顺序变化的时候可以使用缺失值前边或后边的值进行填充

  • 线性插值:假定数据点之间存在严格的线性关系,并利用相邻数据点中的非缺失值来计算缺失数据点的值

4.1 dropna删除缺失值

  • 使用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接收一个列表

      • 接收一个列表,列表中的元素为列名: 对特定的列

        df = pd.read_csv('../data/city_day.csv')
        # 随机获取10条数据
        df2 = df.sample(n=10, random_state=5)
        print(df2)
        # 删除含有缺失值的行数据
        print(df2.dropna())
        # 删除含有缺失值的列
        print(df2.dropna(axis=1))
        # 删除指定列中含有缺失值的行数据
        print(df2.dropna(how='any', subset=['PM2.5', 'Xylene', 'AQI']))
        # 删除指定列中都含有缺失值的行数据
        print(df2.dropna(how='all', subset=['PM2.5', 'Xylene', 'AQI']))
        # 删除含有缺失值的行数据, 剩余非空值个数大于等于12的行数据保留
        print(df2.dropna(thresh=12))

        进行缺失值删除处理

    • thresh=n

      • 可选参数

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

    df = pd.read_csv('../data/city_day.csv')
    # 随机获取10条数据
    df2 = df.sample(n=10, random_state=5)
    print(df2)
    # 删除含有缺失值的行数据
    print(df2.dropna())
    # 删除含有缺失值的列
    print(df2.dropna(axis=1))
    # 删除指定列中含有缺失值的行数据
    print(df2.dropna(how='any', subset=['PM2.5', 'Xylene', 'AQI']))
    # 删除指定列中都含有缺失值的行数据
    print(df2.dropna(how='all', subset=['PM2.5', 'Xylene', 'AQI']))
    # 删除含有缺失值的行数据, 剩余非空值个数大于等于12的行数据保留
    print(df2.dropna(thresh=12))

4.2 fillna固定值填充缺失值

  • 用平均值填充PM2.5的缺失值

    df = pd.read_csv('../data/city_day.csv')
    df2 = df.copy()
    # 计算PM2.5平均值
    pm25_mean = df2['PM2.5'].mean()
    print(pm25_mean)
    # fillna函数填充缺失值,将返回值赋值给原来的列
    df2['PM2.5'] = df2['PM2.5'].fillna(value=pm25_mean)
    print(df2['PM2.5'].isnull().sum())
    ​
    # 数据结果如下
    67.45057794890272
    0

4.3 fillna前后值填充缺失值

时序数据在某一列值的变化往往有一定线性规律,绝大多数的时序数据,具体的列值随着时间的变化而变化,所以对于有时序的行数据缺失值处理可以使用上一个非空值或下一个非空值填充

印度城市空气质量数据明显就是一个时序数据集,空气中的各种成分会随着时间变化而变化,不会出现特别大的急剧变化

  • 使用上一个非空值(参数method='ffill')填充Xylene(二甲苯)的空值

    df = pd.read_csv('../data/city_day.csv')
    s1 = df['Xylene'][54:64]
    print(s1)
    # 用上一个非空值填充并赋值指定列
    print(s1.fillna(method='ffill'))
    ​
    # 输出结果如下
    54    6.05
    55    0.81
    56     NaN
    57     NaN
    58     NaN
    59    1.32
    60    0.22
    61    2.25
    62    1.55
    63    4.13
    Name: Xylene, dtype: float64
    54    6.05
    55    0.81
    56    0.81
    57    0.81
    58    0.81
    59    1.32
    60    0.22
    61    2.25
    62    1.55
    63    4.13
    Name: Xylene, dtype: float64
  • 使用下一个非空值(参数method='bfill')填充整个数据集的空值

    # 用上一个非空值填充并赋值指定列
    print(s1.fillna(method='bfill'))
    ​
    # 输出结果如下
    54    6.05
    55    0.81
    56    1.32
    57    1.32
    58    1.32
    59    1.32
    60    0.22
    61    2.25
    62    1.55
    63    4.13
    Name: Xylene, dtype: float64

4.4 interpolate线性插值

绝大多数的时序数据,具体的列值随着时间的变化而变化。 因此,除了使用bfill和ffill进行插补以外还可以使用线性插值法:它假定数据点之间存在严格的线性关系,并利用相邻数据点中的非缺失值来计算缺失数据点的值。

  • 使用df.interpolate(limit_direction="both") 对缺失数据进行线性填充

    p
    rint(s1.interpolate())
    ​
    # 输出结果如下
    54    6.0500
    55    0.8100
    56    0.9375
    57    1.0650
    58    1.1925
    59    1.3200
    60    0.2200
    61    2.2500
    62    1.5500
    63    4.1300
    Name: Xylene, dtype: float64

总结

  • 缺失值会影响分析计算的结果,这个结果又要用来指导生产经营,所以要重视缺失值

  • 空值仅指Pandas中的空值类型,比如NaN

  • 缺失值包含空值,也有可能是空字符串、数字0、False或None等

  • 不是空值的缺失值可以通过replace函数先替换为NaN空值,之后再按空值进行处理

理解上面的内容,并请对下面的API 有印象、能找到、能理解、能看懂

  • 查看空值

    • df.info() 可以查看数据集每一列非空值的数量

    • isnull & notnull函数 判断是否存在空值

    • df.isnull().sum() 统计空值数量

    • missingno库可以对空值进行可视化探查

      • missingno.matrix(df) 查看缺失值的位置

      • missingno.heatmap(df) 查看缺失值之间的相关性

  • 缺失值的处理

    • df.dropna() 删除缺失值

    • df.fillna(具体值) 将缺失值填充为具体指

    • df.fillna(method='ffill') 使用上一个非空值进行填充

    • df.fillna(method='bfill') 使用下一个非空值进行填充

    • df.interpolate() 线性插值:假定数据点之间存在严格的线性关系,并利用相邻数据点中的非缺失值来计算缺失数据点的值

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

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

相关文章

LeetCode338比特位计数

题目描述 给你一个整数 n &#xff0c;对于 0 < i < n 中的每个 i &#xff0c;计算其二进制表示中 1 的个数 &#xff0c;返回一个长度为 n 1 的数组 ans 作为答案。 解析 动态规划&#xff0c;将当前的数的最后一位去掉&#xff0c;然后判断去掉的最后一位是0还是1。…

pip(3) install,完美解决 externally-managed-environment

前言 现象 在 Manjaro 22、Ubuntu 23.04、Fedora 38 等最新的linux发行版中运行pip install时&#xff0c;通常会收到一个错误提示&#xff1a;error: externally-managed-environment&#xff0c;即“外部管理环境”错误&#xff0c;但这不是一个 bug。 如果您想阅读&#x…

Chrome浏览器书签同步不及时怎么办?两种方法帮你解决!

&#x1f468;‍&#x1f393;博主简介 &#x1f3c5;CSDN博客专家   &#x1f3c5;云计算领域优质创作者   &#x1f3c5;华为云开发者社区专家博主   &#x1f3c5;阿里云开发者社区专家博主 &#x1f48a;交流社区&#xff1a;运维交流社区 欢迎大家的加入&#xff01…

9.7 Go语言入门(映射 Map)

Go语言入门&#xff08;映射 Map&#xff09; 目录六、映射 Map1. 声明和初始化映射1.1 使用 make 函数1.2 使用映射字面量 2. 映射的基本操作2.1 插入和更新元素2.2 访问元素2.3 检查键是否存在2.4 删除元素2.5 获取映射的长度 3. 遍历映射4. 映射的注意事项4.1 映射的零值4.2…

Foxmail邮箱的使用方法和功能最全介绍

Foxmail邮箱是我们办公邮箱中比较有代表性和使用性的一款邮箱软件&#xff0c;今天笔者为大家介绍一下Foxmail邮箱的功能和使用方法。 1、首先我们从安装Foxmail邮箱开始 2、点击安装等待安装成功 3、双击打开 &#xff0c;出现邮箱设置界面输入我们的账号密码&#xff0c;点击…

Elasticsearch 管道查询语言 ES|QL 现已正式发布

作者&#xff1a;Costin Leau, George Kobar 今天&#xff0c;我们很高兴地宣布 ES|QL&#xff08;Elasticsearch 查询语言&#xff09;全面上市&#xff0c;这是一种从头开始设计的动态语言&#xff0c;用于转换、丰富和简化数据调查。在新的查询引擎的支持下&#xff0c;ES|Q…

【JAVASE】详讲JAVA语法

这篇你将收获到以下知识&#xff1a; &#xff08;1&#xff09;方法重载 &#xff08;2&#xff09;方法签名 一&#xff1a;方法重载 什么是方法重载&#xff1f; 在一个类中&#xff0c;出现了多个方法的名称相同&#xff0c;但是它们的形参列表是不同的&#xff0c;那…

Transparent 且 Post-quantum zkSNARKs

1. 引言 前序博客有&#xff1a; SNARK原理示例SNARK性能及安全——Prover篇SNARK性能及安全——Verifier篇 上图摘自STARKs and STARK VM: Proofs of Computational Integrity。 上图选自&#xff1a;Dan Boneh 斯坦福大学 CS251 Fall 2023 Building a SNARK 课件。 SNARK…

逻辑这回事(四)----时序分析与时序优化

基本时序参数 图1.1 D触发器结构 图1.2 D触发器时序 时钟clk采样数据D时&#xff0c;Tsu表示数据前边沿距离时钟上升沿的时间&#xff0c;MicTsu表示时钟clk能够稳定采样数据D的所要求时间&#xff0c;Th表示数据后边沿距离时钟上升沿的时间&#xff0c;MicTh表示时钟clk采样…

C语言王国——数据的内存管理

目录 一、引言 二、整形在内存中的存储 2.1 进制之间的转换 2.1.1 整形的二进制 2.1.2 十进制和二进制 2.1.3 十进制和八进制的转换 2.1.4 十六进制和十进制的转换 2.2 原码&#xff0c;反码&#xff0c;和补码 三、大、小端字节序 3.1 大小端的定义 3.2 为什么会有大…

【Linux进程篇】Linux中的等待机制与替换策略

W...Y的主页 &#x1f60a; 代码仓库分享&#x1f495; 目录 ​编辑 进程等待 进程等待必要性 进程等待的方法 wait方法 waitpid方法 获取子进程status 阻塞与非阻塞 进程程序替换 替换原理 替换函数 进程等待 进程等待必要性 之前讲过&#xff0c;子进程退出&am…

【教学类-40-01】20240607类似MJ的免费AI绘画工具——文心一格与通义万相

背景需求&#xff1a; 风变的AI对话大师一年到期了&#xff0c;也没有看到续费的按钮。不能使用它写代码了。 MJ早就用完了&#xff0c;最后480次&#xff0c;我担心信息课题会用到它生图&#xff0c;所以不敢用。 最近探索其他类似MJ的免费出图工具 一、文心一格&#xff08;…

C# E2Pose人体关键点检测(OpenVINO推理)

C# E2Pose人体关键点检测(OpenVINO推理) 目录 效果 模型信息 项目 代码 下载 效果 模型信息 Inputs ------------------------- name&#xff1a;inputimg tensor&#xff1a;Float[1, 3, 512, 512] --------------------------------------------------------------- Ou…

实验六、IPv4 地址的子网划分,第 2 部分《计算机网络》

你有没有发现&#xff0c;困的时候真的清醒不了。 目录 一、实验目的 二、实验内容 三、实验小结 一、实验目的 完成本练习之后&#xff0c;您应该能够确定给定 IP 地址和子网掩码的子网信息。 知道 IP 地址、网络掩码和子网掩码后&#xff0c;您应该能够确定有关该 IP 地…

二、Nginx原来是这样?(系列篇02)

二、Nginx原来是这样&#xff1f;&#xff08;系列篇02&#xff09; 大家好&#xff0c;我是秋意零。 今天分享Nginx系列篇的第二节。Nginx目录结构、运行原理、基本配置。 更多请关注&#xff0c;Nginx系列篇主页&#xff1a;https://mp.weixin.qq.com/mp/appmsgalbum?__b…

STM32 uc/OS-III多任务程序

目录 一、项目创建 二、代码移植 1、uC/OS-III源码处理 2、KEIL文件配置 ​编辑3、文件修改 启动文件 ​编辑app_cfg.h includes.h bsp.c和bsp.h main.c lib_ cfg.h app.c和app.h 三、总结 学习目标&#xff1a; 学习嵌入式实时操作系统&#xff08;RTOS&#xf…

找素数第二、三种方法

文章目录 第一种 &#xff1a;使用标签第二种&#xff1a;本质是方法的分装 第一种 &#xff1a;使用标签 没有使用信号量。break和continue作用范围只是最近的循环&#xff0c;无法控制外部循环。 此时使用标签 对外部循环进行操作。 package com.zhang; /* 找素数 第二种方…

小白教程--- kali(po解)WIFI密码 (图文教程)

kali学得好&#xff0c;牢饭少不了&#xff01;&#xff01;&#xff01; 原理&#xff1a; 模拟WiFi的已连接设备&#xff0c;强制让其下线重连&#xff0c;获取其握手包&#xff0c;使用密码字典&#xff08;宝丽&#xff09;婆洁。 环境&#xff08;准备工作&#xff09;&a…

计网仿真综合实验 实验十二

实验十二 综合网络实验 实验过程 IP配置说明参考连线配置OSPF使公司内部联通 路由器R1的OSPF配置路由器R2的OSPF配置路由器R3的OSPF配置R1、R2、R3的相关解释路由器R4的OSPF配置路由器R5的OSPF配置路由器R6的OSPF配置R4、R5、R6解释: 路由器R2的RIP配置路由器R7的RIP配置 总结 …

Unity DOTS技术(十五) 物理系统

要解决性能的瓶颈问题,在DOTS中我们将不再使用Unity自带的物理组件. 下面来分享一下在DOTS中当如何使用物理插件. 一.导入插件 在使用DOTS系创建的实体我们会发现,游戏物体无法受物理系统影响进行运动.于是我们需要添加物理系统插件. 1.打开Package Manager > 搜索插件Uni…