导读:此前的文章《一文看懂数据清洗:缺失值、异常值和重复值的处理》中,我们介绍了数据清洗的过程和方法,本文给出各步骤的详细代码,方便你动手操作。

作者:宋天龙

如需转载请联系大数据(ID:hzdashuju)

本文示例中,主要用了几个知识点:

  • 通过 pd.DataFrame 新建数据框。
  • 通过 df.iloc[] 来选择特定的列或对象。
  • 使用Pandas的 isnull() 判断值是否为空。
  • 使用 all() 和 any() 判断每列是否包含至少1个为True或全部为True的情况。
  • 使用Pandas的 dropna() 直接删除缺失值。
  • 使用 sklearn.preprocessing 中的 Imputer 方法对缺失值进行填充和替换,支持3种填充方法。
  • 使用Pandas的 fillna 填充缺失值,支持更多自定义的值和常用预定义方法。
  • 通过 copy() 获得一个对象副本,常用于原始对象和复制对象同时进行操作的场景。
  • 通过 for 循环遍历可迭代的列表值。
  • 自定义代码实现了 Z-Score 计算公式。
  • 通过Pandas的 duplicated() 判断重复数据记录。
  • 通过Pandas的 drop_duplicates() 删除数据记录,可指定特定列或全部。

01 缺失值处理
在缺失值的处理上,主要配合使用 sklearn.preprocessing 中的Imputer类、Pandas和Numpy。其中由于Pandas对于数据探索、分析和探查的支持较为良好,因此围绕Pandas的缺失值处理较为常用。
1. 导入库
该代码示例中用到Pandas、Numpy和sklearn。

import pandas as pd               # 导入Pandas库
import numpy as np               # 导入Numpy库
from sklearn.preprocessing import Imputer     # 导入sklearn.preprocessing中的Imputer库

2. 生成缺失数据

# 生成缺失数据
df = pd.DataFrame(np.random.randn(6, 4), columns=['col1', 'col2', 'col3', 'col4'])                      # 生成一份数据
df.iloc[1:2, 1] = np.nan            # 增加缺失值
df.iloc[4, 3] = np.nan               # 增加缺失值
print(df)

通过Pandas生成一个6行4列,列名分别为'col1'、'col2'、'col3'、'col4'的数据框。同时,数据框中增加两个缺失值数据。
除了示例中直接通过pd.DataFrame来直接创建数据框外,还可以使用数据框对象的 df.from_records、df.from_dict、df.from_items 来从元组记录、字典和键值对对象创建数据框,或使用 pandas.read_csv、pandas.read_table、pandas.read_clipboard 等方法读取文件或剪贴板创建数据框。该代码段执行后返回了定义含有缺失值的数据框,结果如下:

       col1      col2      col3      col4
0 -0.112415 -0.768180 -0.084859  0.296691
1 -1.777315       NaN -0.166615 -0.628756
2 -0.629461  1.892790 -1.850006  0.157567
3  0.544860 -1.230804  0.836615 -0.945712
4  0.703394 -0.764552 -1.214379       NaN
5  1.928313 -1.376593 -1.557721  0.289643

提示:由于生成的数据是随机产生的,因此读者的实际结果可能与上述结果不一致。
3. 判断缺失值

# 查看哪些值缺失
nan_all = df.isnull()      # 获得所有数据框中的N值
print(nan_all)          # 打印输出
# 查看哪些列缺失
nan_col1 = df.isnull().any()    # 获得含有NA的列
nan_col2 = df.isnull().all()    # 获得全部为NA的列
print(nan_col1)              # 打印输出
print(nan_col2)              # 打印输出

通过 df.null() 方法找到所有数据框中的缺失值(默认缺失值是 NaN 格式),然后使用 any() 或 all() 方法来查找含有至少1个或全部缺失值的列,其中 any() 方法用来返回指定轴中的任何元素为 True,而 all() 方法用来返回指定轴的所有元素都为 True。该代码段执行后返回如下结果。
判断元素是否是缺失值(第2行第2列和第5行第4列):

   col1   col2   col3   col4
0  False  False  False  False
1  False   True  False  False
2  False  False  False  False
3  False  False  False  False
4  False  False  False   True
5  False  False  False  False

列出至少有一个元素含有缺失值的列(该示例中为col2和col4):

col1    False
col2     True
col3    False
col4     True
dtype: bool

列出全部元素含有缺失值的列(该示例中没有):

col1    False
col2    False
col3    False
col4    False
dtype: bool

4. 丢弃缺失值

df2 = df.dropna()  # 直接丢弃含有NA的行记录
print(df2)  # 打印输出

通过Pandas默认的 dropna() 方法丢弃缺失值,返回无缺失值的数据记录。该代码段执行后返回如下结果(第2行、第5行数据记录被删除):

       col1      col2      col3      col4
0 -0.112415 -0.768180 -0.084859  0.296691
2 -0.629461  1.892790 -1.850006  0.157567
3  0.544860 -1.230804  0.836615 -0.945712
5  1.928313 -1.376593 -1.557721  0.289643

5. 通过sklearn的数据预处理方法对缺失值进行处理

nan_model = Imputer(missing_values='NaN', strategy='mean', axis=0)  # 建立替换规则:将值为NaN的缺失值以均值做替换
nan_result = nan_model.fit_transform(df)  # 应用模型规则
print(nan_result)  # 打印输出

首先通过 Imputer 方法创建一个预处理对象,其中 missing_values 为默认缺失值的字符串,默认为 NaN;示例中选择缺失值替换方法是均值(默认),还可以选择使用中位数和众数进行替换,即 strategy 值设置为 median 或 most_frequent;后面的参数 axis 用来设置输入的轴,默认值为0,即使用列做计算逻辑。
然后使用预处理对象的 fit_transform 方法对 df(数据框对象)进行处理,该方法是将 fit 和 transform 组合起来使用。代码执行后返回如下结果:

[[-0.11241503 -0.76818022 -0.08485904  0.29669147][-1.77731513 -0.44946793 -0.16661458 -0.62875601][-0.62946127  1.89278959 -1.85000643  0.15756702][ 0.54486026 -1.23080434  0.836615   -0.9457117 ][ 0.70339369 -0.76455205 -1.21437918 -0.16611331][ 1.92831315 -1.37659263 -1.55772092  0.28964265]]

代码中的第2行第2列和第5行第4列分别被各自列的均值替换。为了验证,我们手动计算一下各自列的均值,通过使用 df['col2'].mean() 和 df['col4'].mean() 分别获得这两列的均值为-0.4494679289032068和-0.16611331259664791,与sklearn返回的结果一致。
6. 使用Pandas做缺失值处理

nan_result_pd1 = df.fillna(method='backfill')          # 用后面的值替换缺失值
nan_result_pd2 = df.fillna(method='bfill', limit=1)      # 用后面的值替代缺失值,限制每列只能替代一个缺失值
nan_result_pd3 = df.fillna(method='pad')          # 用前面的值替换缺失值
nan_result_pd4 = df.fillna(0)                  # 用0替换缺失值
nan_result_pd5 = df.fillna({'col2': 1.1, 'col4': 1.2})    # 用不同值替换不同列的缺失值
nan_result_pd6 = df.fillna(df.mean()['col2':'col4'])    # 用各自列的平均数替换缺失值
# 打印输出
print(nan_result_pd1)                      # 打印输出
print(nan_result_pd2)                      # 打印输出
print(nan_result_pd3)                      # 打印输出
print(nan_result_pd4)                      # 打印输出
print(nan_result_pd5)                     # 打印输出
print(nan_result_pd6)                      # 打印输出

Pandas对缺失值的处理方法是 df.fillna(),该方法中最主要的两个参数是 value 和 method。前者通过固定(或手动指定)的值替换缺失值,后者使用Pandas提供的默认方法替换缺失值。以下是 method 支持的方法。

  • pad 和 ffill:使用前面的值替换缺失值,示例中 nan_result_pd3 使用了 pad 方法。
  • backfill 和 bfill:使用后面的值替换缺失值,示例中 nan_result_pd1 和 nan_result_pd2 使用了该方法。
  • None:无。

在示例中, nan_result_pd4、nan_result_pd5、nan_result_pd6 分别使用0、不同的值、平均数替换缺失值。需要注意的是,如果要使用不同具体值替换,需要使用 scalar、dict、Series 或 DataFrame 的格式定义。
上述代码执行后返回如下结果。
用后面的值(method='backfill')替换缺失值:

       col1      col2      col3      col4
0 -0.112415 -0.768180 -0.084859  0.296691
1 -1.777315  1.892790 -0.166615 -0.628756
2 -0.629461  1.892790 -1.850006  0.157567
3  0.544860 -1.230804  0.836615 -0.945712
4  0.703394 -0.764552 -1.214379  0.289643
5  1.928313 -1.376593 -1.557721  0.289643

用后面的值(method='bfill', limit = 1)替换缺失值:

       col1      col2      col3      col4
0 -0.112415 -0.768180 -0.084859  0.296691
1 -1.777315  1.892790 -0.166615 -0.628756
2 -0.629461  1.892790 -1.850006  0.157567
3  0.544860 -1.230804  0.836615 -0.945712
4  0.703394 -0.764552 -1.214379  0.289643
5  1.928313 -1.376593 -1.557721  0.289643

用前面的值替换缺失值(method='pad'):

       col1      col2      col3      col4
0 -0.112415 -0.768180 -0.084859  0.296691
1 -1.777315 -0.768180 -0.166615 -0.628756
2 -0.629461  1.892790 -1.850006  0.157567
3  0.544860 -1.230804  0.836615 -0.945712
4  0.703394 -0.764552 -1.214379 -0.945712
5  1.928313 -1.376593 -1.557721  0.289643

用0替换缺失值:

       col1      col2      col3      col4
0 -0.112415 -0.768180 -0.084859  0.296691
1 -1.777315  0.000000 -0.166615 -0.628756
2 -0.629461  1.892790 -1.850006  0.157567
3  0.544860 -1.230804  0.836615 -0.945712
4  0.703394 -0.764552 -1.214379  0.000000
5  1.928313 -1.376593 -1.557721  0.289643

手动指定两个缺失值分布为1.1和1.2:

       col1      col2      col3      col4
0 -0.112415 -0.768180 -0.084859  0.296691
1 -1.777315  1.100000 -0.166615 -0.628756
2 -0.629461  1.892790 -1.850006  0.157567
3  0.544860 -1.230804  0.836615 -0.945712
4  0.703394 -0.764552 -1.214379  1.200000
5  1.928313 -1.376593 -1.557721  0.289643

用平均数代替,选择各自列的均值替换缺失值:

       col1      col2      col3      col4
0 -0.112415 -0.768180 -0.084859  0.296691
1 -1.777315 -0.449468 -0.166615 -0.628756
2 -0.629461  1.892790 -1.850006  0.157567
3  0.544860 -1.230804  0.836615 -0.945712
4  0.703394 -0.764552 -1.214379 -0.166113
5  1.928313 -1.376593 -1.557721  0.289643

以上示例中,直接指定 method 的方法适用于大多数情况,较为简单直接;但使用 value 的方法则更为灵活,原因是可以通过函数的形式将缺失值的处理规则写好,然后直接赋值即可。限于篇幅,不对所有方法做展开讲解。
另外,如果是直接替换为特定值的应用,也可以考虑使用Pandas的 replace 功能。本示例的 df (原始数据框)可直接使用 df.replace(np.nan,0),这种用法更加简单粗暴,但也能达到效果。当然,replace的出现是为了解决各种替换应用的,缺失值只是其中的一种应用而已。
上述过程中,主要需要考虑的关键点是缺失值的替换策略,可指定多种方法替换缺失值,具体根据实际需求而定,但大多数情况下均值、众数和中位数的方法较为常用。如果场景固定,也可以使用特定值(例如0)替换。
在使用不同的缺失值策略时,需要注意以下几个问题:

  1. 缺失值的处理的前提是已经可以正确识别所有缺失值字段,关于识别的问题在使用Pandas读取数据时可通过设置 na_values 的值指定。但是如果数据已经读取完毕并且不希望再重新读取,那可以使用Pandas的 replace 功能将指定的字符串(或列表)替换为 NaN。更有效的是,如果数据中的缺失值太多而无法通过列表形式穷举时,replace 还支持正则表达式的写法。
  2. 当列中的数据全部为空值时,任何替换方法都将失效,任何基于中位数、众数和均值的策略都将失效。除了可以使用固定值替换外(这种情况下即使替换了该特征也没有实际参与模型的价值),最合理的方式是先将全部为缺失值的列删除,然后再做其他处理。
  3. 当列中含有极大值或极小值的 inf 或 -inf 时,会使得 mean() 这种方法失效,因为这种情况下将无法计算出均值。应对思路是使用 median 中位数做兜底策略,只要列中有数据,就一定会有中位数。

02 异常值处理
有关异常值的确定有很多规则和方法,这里使用Z标准化得到的阈值作为判断标准:当标准化后的得分超过阈值则为异常。完整代码如下。
示例代码分为3个部分。
1. 导入本例需要的Pandas库

import pandas as pd  # 导入Pandas库

2. 生成异常数据

df = pd.DataFrame({'col1': [1, 120, 3, 5, 2, 12, 13],'col2': [12, 17, 31, 53, 22, 32, 43]})
print(df)  # 打印输出

直接通过DataFrame创建一个7行2列的数据框,打印输出结果如下:

   col1  col2
0     1    12
1   120    17
2     3    31
3     5    53
4     2    22
5    12    32
6    13    43

3. 为通过Z-Score方法判断异常值

df_zscore = df.copy()                  # 复制一个用来存储Z-score得分的数据框
cols = df.columns                  # 获得数据框的列名
for col in cols:                      # 循环读取每列df_col = df[col]                  # 得到每列的值z_score = (df_col - df_col.mean()) / df_col.std()  # 计算每列的Z-score得分df_zscore[col] = z_score.abs() > 2.2        # 判断Z-score得分是否大于2.2,如果是则为True,否则为False
print(df_zscore)                      # 打印输出

本过程中,先通过 df.copy() 复制一个原始数据框的副本,用来存储Z-Score标准化后的得分,再通过 df.columns 获得原始数据框的列名,接着通过循环判断每一列中的异常值。在判断逻辑中,对每一列的数据进行使用自定义的方法做Z-Score值标准化得分计算,然后与阈值2.2做比较,如果大于阈值则为异常。本段代码返回结果如下:

    col1   col2
0  False  False
1   True  False
2  False  False
3  False  False
4  False  False
5  False  False
6  False  False

在本示例方法中,阈值的设定是确定异常与否的关键,通常当阈值大于2.2时,就是相对异常的表现值。
4. 删除带有异常值所在的记录行

df_drop_outlier = df[df_zscore['col1'] == False]
print(df_drop_outlier)

本段代码里我们直接使用了Pandas的选择功能,即只保留在 df_zscore 中异常列(col1)为 False 的列。完成后在输出的结果中可以看到,删除了 index 值为1的数据行。

   col1  col2
0     1    12
2     3    31
3     5    53
4     2    22
5    12    32
6    13    43

上述过程中,主要需要考虑的关键点是:如何判断异常值。
对于有固定业务规则的可直接套用业务规则,而对于没有固定业务规则的,可以采用常见的数学模型进行判断:

  • 基于概率分布的模型(例如正态分布的标准差范围)
  • 基于聚类的方法(例如KMeans)
  • 基于密度的方法(例如LOF)
  • 基于分类的方法(例如KNN)
  • 基于统计的方法(例如分位数法)等。

异常值的定义带有较强的主观判断色彩,具体需要根据实际情况选择。

03 重复值处理
有关重复值的处理代码分为4个部分。
1. 导入用到的Pandas库

import pandas as pd  # 导入Pandas库

2. 生成重复数据

data1, data2, data3, data4 = ['a', 3], ['b', 2], ['a', 3], ['c', 2]
df = pd.DataFrame([data1, data2, data3, data4], columns=['col1', 'col2'])
print(df)

在代码中,我们在一列中直接给4个对象赋值,也可以拆分为4行分别赋值。该数据是一个4行2列数据框,数据结果如下:

  col1  col2
0    a     3
1    b     2
2    a     3
3    c     2

3. 判断重复数据

isDuplicated = df.duplicated()    # 判断重复数据记录
print(isDuplicated)          # 打印输出

判断数据记录是否为重复值,返回每条数据记录是否重复结果,取值为 True 或 False。判断方法为 df.duplicated(),该方法中两个主要的参数是 subset 和 keep。

  • subset:要判断重复值的列,可以指定特定列或多个列。默认使用全部列。
  • keep:当重复时不标记为True的规则,可设置为第1个(first)、最后一个(last)和全部标记为True(False)。默认使用first,即第1个重复值不标记为True。

结果如下:

0    False
1    False
2     True
3    False
dtype: bool

4. 删除重复值

print(df.drop_duplicates())           # 删除数据记录中所有列值相同的记录
print(df.drop_duplicates(['col1']))       # 删除数据记录中col1值相同的记录
print(df.drop_duplicates(['col2']))       # 删除数据记录中col2值相同的记录
print(df.drop_duplicates(['col1', 'col2']))  # 删除数据记录中指定列(col1/col2)值相同的记录

该操作的核心方法是 df.drop_duplicates(),该方法的作用是基于指定的规则判断为重复值之后,删除重复值,其参数跟 df.duplicated() 完全相同。在该部分方法示例中,依次使用默认规则(全部列相同的数据记录)、col1列相同、col2列相同以及指定col1和col2完全相同4种规则进行去重。返回结果如下。
删除数据记录中所有列值相同的记录,index为2的记录行被删除:

  col1  col2
0    a     3
1    b     2
3    c     2

删除数据记录中col1值相同的记录,index为2的记录行被删除:

  col1  col2
0    a     3
1    b     2
3    c     2

删除数据记录中col2值相同的记录,index为2和3的记录行被删除:

  col1  col2
0    a     3
1    b     2

删除数据记录中指定列(col1和col2)值相同的记录,index为2的记录行被删除:

  col1  col2
0    a     3
1    b     2
3    c     2

提示:由于数据是通过随机数产生,因此读者操作的结果可能与上述示例的数据结果不同。
除了可以使用Pandas来做重复值判断和处理外,也可以使用Numpy中的 unique() 方法,该方法返回其参数数组中所有不同的值,并且按照从小到大的顺序排列。Python自带的内置函数 set 方法也能返回唯一元素的集合。
上述过程中,主要需要考虑的关键点是:如何对重复值进行处理。重复值的判断相对简单,而判断之后如何处理往往不是一个技术特征明显的工作,而是侧重于业务和建模需求的工作。

关于作者:宋天龙,深大数据技术专家,触脉咨询合伙人兼副总裁,前Webtrekk中国区技术和咨询负责人(德国最大在线数据分析服务提供商)。擅长数据挖掘、建模、分析与运营,精通端到端数据价值场景设计、业务需求转换、数据结构梳理、数据建模与学习以及数据工程交付。在电子商务、零售、银行、保险等多个行业拥有丰富的数据项目工作经验。

本文摘编自《Python数据分析与数据化运营》(第2版),经出版方授权发布。

延伸阅读《Python数据分析与数据化运营》

(第2版)

点击上图了解及购买

转载请联系微信:DoctorData

推荐语:这是一本将数据分析技术与数据使用场景深度结合的著作,从实战角度讲解了如何利用Python进行数据分析和数据化运营。本书与同类书大的不同在于,并不只有纯粹的关于数据分析技术和工具的讲解,而且还与数据使用场景深度结合,在业务上真正可指导落地。此外,本书作者提供微信、邮箱等,可通过实时和离线两种方式及时为读者在线传道、受业、解惑。

「大数据」内容合伙人之「鉴书小分队」上线啦!

最近,你都在读什么书?有哪些心得体会想要跟大家分享?

数据叔最近搞了个大事——联合优质图书出版商机械工业出版社华章公司发起鉴书活动。

简单说就是:你可以免费读新书,你可以免费读新书的同时,顺手码一篇读书笔记就行。详情请在大数据公众号后台对话框回复合伙人查看。

福利时间?

北京第二十六届国际图书博览会(BIBF)如约而至

爱读书的你绝对不能错过!

数据叔的福利也如约而至

报名参加BIBF华章图书现场活动的小伙伴们

即可来展位报销门票哟!

有话要说?

Q: 关于数据清洗,你还有哪些问题?

欢迎留言与大家分享

猜你想看?

  • 从游戏AI到自动驾驶,一文看懂强化学习的概念及应用

  • 什么是机器学习?有哪些分类?到底有什么用?终于有人讲明白了

  • 6本豆瓣高分书,国内外的技术大牛都在看!

  • 关于机器学习的知识点,全在这篇文章里了

更多精彩?

在公众号对话框输入以下关键词

查看更多优质内容!

PPT | 报告 | 读书 | 书单 | 干货 

大数据 | 揭秘 | Python | 可视化

AI | 人工智能 | 5G | 区块链

机器学习 | 深度学习 | 神经网络

合伙人 1024 | 段子 | 数学 | 高考

据统计,99%的大咖都完成了这个神操作

?

觉得不错,请把这篇文章分享给你的朋友

转载 / 投稿请联系:baiyu@hzbook.com

更多精彩,请在后台点击“历史文章”查看

点击阅读原文,了解更多

Python代码实操:详解数据清洗相关推荐

  1. python三维图能画地图_Python地图绘制实操详解

    网上有很多地图绘制的教程,更多趋向于全国地图或者省级地图,但有时我们需要到县级.闲得慌,今天以贵州省毕节市为例,分享一篇Python县级地图的绘制(遥想当时差点把百度翻了个底朝天),希望对需要的你能有 ...

  2. c调用python脚本如何获取结果_使用C++调用Python代码的方法详解

    一.配置python环境问题 1.首先安装Python(版本无所谓),安装的时候选的添加python路径到环境变量中 安装之后的文件夹如下所示: 2.在VS中配置环境和库 右击项目->属性-&g ...

  3. 21.ACL 访问控制权限详解,setfacl,getfacl,setfacl -m,setfacl -d,setfacl -k,setfacl -x,mask等实操详解

    ACL 访问控制权限详解,setfacl,getfacl,setfacl -m,setfacl -d,setfacl -k,setfacl -x,mask等实操详解 文章目录 ACL (访问控制权限) ...

  4. gcc编程4步编译、调试c程序实操详解(Linux系统编程)

    gcc编译可以执行程序4步骤:预处理.编译.汇编.链接 一.知识储备(想看实战往下翻) 在linux程序种,c程序需要用gcc进行编译,链接用ld程序,ggc编译完成后可自动调用ld程序完成链接. 调 ...

  5. 【iVX 开发 - 入门】UI 组件介绍及实操详解

    本文导读 写在前面 iVX 各 UI 组件及属性面板详解 1. 图片组件 2. 图片序列组件 3. 文本组件 4. 输入框组件 5. 富文本/富文本编辑器组件 6. 地图组件 7. 二维码组件 写在前 ...

  6. Pytorch实现手写体识别(基于CNN卷积神经网络)实操详解(附完整代码free)

    手写体作为深度学习的"Hello world",几乎所有的课程都会讲到这个,今天带着大家一些看看吧. 如果对你有所帮助,点个赞给个小关注,以后一起交流学习. 前言 首先和大家讲讲我 ...

  7. python 格式化工具_Google的Python代码格式化工具YAPF详解

    平时习惯了杂乱无章地编写代码,而最后的代码勘定,却依赖于PyCharm自带的格式化工具,以及其自带的提示功能来规范代码.而pycharm里的格式化工具,不支持对多文件进行代码批量格式化,曾经尝试些解决 ...

  8. Nginx+Tomcat负载均衡和动静分离理论实操详解来袭!

    文章目录 一:关于动静分离和负载均衡介绍 1.1:Nginx+Tomcat的动静分离 1.2:Nginx+Tomcat的负载均衡 1.3:Nginx配置反向代理的主要参数 二:Nginx+Tomcat ...

  9. 干货 | Elasticsearch7.X X-Pack基础安全实操详解

    1.调查:你的Elasticsearch怎么做的安全防护? 背景:大家知道elasticsearch早期版本安全部分收费(7.1 & 6.8 版本之前),实际中各个公司6.x,5.x,2.x, ...

最新文章

  1. 与15级新加入团队同学的约定
  2. 《软件观念革命——交互设计精髓》读书笔记(一)
  3. C++中利用WebService下载文件
  4. 算术基本定理证明用计算机,良序原理:算术基本定理的证明
  5. 国外persona用户画像_使用Mozilla Persona验证用户的指南
  6. php mysql 随机字符串_MySQL_Mysql 自定义随机字符串的实现方法,前几天在开发一个系统,需要 - phpStudy...
  7. 39 FI配置-财务会计-固定资产-组织结构-定义号码范围间隔
  8. 为什么鲍尔默时代的微软会一败再败?
  9. DP练习(初级):ZigZag
  10. js替换a标签href
  11. Mobx-action
  12. 如何用控制面板打开计算机配置,如何查看电脑的配置?学会下面几种方法,你就可以自己看电脑配置...
  13. vue面试题、react面试题大全、ES6等....
  14. 是否对纯色背景的IDE感到乏味?那就让vscode背景变成你想要的样子
  15. 2021国家开放大学计算机网络安全技术形成性考核二
  16. Beyond compare用法详解
  17. 软银进军共享单车,采用GPS智能锁具
  18. Kafka从入门到精通(七)分区和副本机制
  19. 肠道菌群检测在临床感染判别中的应用
  20. 使用国内镜像站下载树莓派 Raspberry Pi OS 操作系统

热门文章

  1. Java通过反射了解集合泛型的本质(Class反射都是在运行时执行的)
  2. C++|Qt中QTreeWidget基本操作及完整代码下载
  3. linux下cabal安装教程,Centos 7 安装shellcheck
  4. java 优酷视频缩略图_优酷视频缩略图
  5. python自加_浅谈:为什么python没有自增运算符?
  6. raid ahci模式哪个好_比群晖好用?威联通TR-004磁盘阵列外接盒使用详解
  7. glibc free 死锁
  8. C++设计模式-AbstractFactory抽象工厂模式
  9. 763 划分字母区间
  10. poj1064 二分搜索 挑战程序设计竞赛