Code前端首页关于Code前端联系我们

PYTHON:pandas完整的缺失值处理(附代码)

terry 2年前 (2023-09-25) 阅读数 50 #后端开发

pandas处理缺失值的手册!

PYTHON:pandas 缺失数据处理大全(附代码)

1。缺失值类型

pandas中,缺失数据显示为NaN。缺失值可以通过三种方式呈现:np.nannonepd.NA

1。 np.nan

缺失值有属性(坑),它不等于任何值,甚至不等于它本身。如果将值 nan 与任何其他值进行比较,则返回 nan

np.nan == np.nan
>> False

正是因为这个特性,读取数据集后,无论哪一列数据,缺失的默认值都是np.nan

由于nan类型Numpy是浮点数,因此将整数列转换为浮点数;并且字符类型不能转为float,只能连接。它是一个对象类型(“O”)。如果原本是float类型,则类型保持不变。

type(np.nan)
>> float
pd.Series([1,2,3]).dtype
>> dtype('int64')
pd.Series([1,np.nan,3]).dtype
>> dtype('float64')

初学者在数据处理过程中遇到对象类型时感到困惑。他不知道那是什么。明明是一个字型,导入后就发生了变化。事实上,这是由于缺失值造成的。

此外,我们引入了一种单独存在的时间序列缺失值,用NaT 表示。是内置类型pandas可以认为是np.nan时间序列版本,也和本身不一样。

s_time = pd.Series([pd.Timestamp('20220101')]*3)
s_time
>> 0 2022-01-01
   1 2022-01-01
   2 2022-01-01
   dtype:datetime64[ns]
-----------------
s_time[2] = pd.NaT
s_time
>> 0 2022-01-01
   1 2022-01-01
   2 NaT
   dtype:datetime64[ns]

2,Nothing

另一个是Nothing,比nan稍微好一点,因为至少它是它自己。输入数字类型后,

None == None
>> True

自动更改为np.nan。只有当对象类型通过时

type(pd.Series([1,None])[1])
>> numpy.float64

才是不变的,所以可以认为如果不是人为命名没什么没有原则上不是pandas ,所以Nothing几乎对每个人来说都是看不见的。 ?处于试用阶段。

开发者也注意到了这一点。对于不同的数据类型使用不同的缺失值表示是非常混乱的。 pd.NA 的存在是为了一致性。 pd.NA 的目标是提供一个缺失值检测器,可以在许多不同的数据类型中一致使用(而不是在使用 np.nan、None 或 NaT 时临时使用)。

s_new = pd.Series([1, 2], dtype="Int64")
s_new
>> 0   1
   1   2
   dtype: Int64
-----------------
s_new[1] = pd.NaT
s_new
>> 0    1
   1  <NA>
   dtype: Int64

同样,布尔类型和字符类型的原始数据类型不变。这样就解决了每次都换成object类型的问题。

以下是pd.NA中常见算术运算和比较运算的示例:

##### 算术运算
# 加法
pd.NA + 1
>> <NA>
-----------
# 乘法
"a" * pd.NA
>> <NA>
-----------
# 以下两种其中结果为1
pd.NA ** 0
>> 1
-----------
1 ** pd.NA
>> 1

##### 比较运算
pd.NA == pd.NA
>> <NA>
-----------
pd.NA < 2.5
>> <NA>
-----------
np.log(pd.NA)
>> <NA>
-----------
np.add(pd.NA, 1)
>> <NA>

2.缺失值估计

了解了缺失值的各种形式后,我们需要知道如何估计缺失值。在数据帧中,确定缺失的最重要方法是isnull()isna()。这两个方法直接返回True布尔值​​和False。它可以涉及整个数据帧或特定列。 ?

3。缺失值统计

1。缺失列

通常我们会对 dataframe 进行缺失统计,看看有多少缺失列。如果缺失量过多,则进行删除或插值等操作。然后将 isnull() 直接应用于 .sum() 返回的结果。 axis默认值为0,0为列,1即可。

## 列缺失统计
isnull().sum(axis=0)

2。该行缺失了

但在许多情况下,我们还需要为该行 制作缺失值 。例如,数据线可能没有单个值。如果这个样本进入模型,将会造成较大的干扰。因此,通常会检查并计算行价格和缺失行价格。

功能很简单,只需将axis=1设置为sum()即可。

## 行缺失统计
isnull().sum(axis=1)

3。缺失物品数量

有时我不仅仅想知道缺失物品的数量,还想知道缺失物品的比例,即缺失的金额。通常,您可以考虑上面获得的值并将其与总行数进行比较。但实际上这里有一个可以一步完成的小技巧。

## 缺失率
df.isnull().sum(axis=0)/df.shape[0]

## 缺失率(一步到位)
isnull().mean()

4。缺失值过滤

过滤需要执行 loc 代码。行和列的缺失过滤如下:

# 筛选有缺失值的行
df.loc[df.isnull().any(1)]
>> A B C D
1 a1 None 2 NaN
-----------------
# 筛选有缺失值的列
df.loc[:,df.isnull().any()]
>> B D
0 b1 5.0
1 None NaN
2 b2 9.0
3 b3 10.0

如果要查询没有缺失值的行和列,可以使表达式 ~功能无效: 评估,是是否有任何缺失的物品。您还可以使用 all 命令来评估是否全部丢失。您还可以对行进行评分。如果整个列或行包含缺失值,则变量或样本失去分析的重要性,可以考虑删除。

5. 填充缺失值

我们通常有两种处理缺失值的方式,一种是直接删除,另一种是保留并填充。我们先介绍填充方法fillna

# 将dataframe所有缺失值填充为0
df.fillna(0)
>> A B C D
0 a1 b1 1 5.0
1 a1 0 2 0.0
2 a2 b2 3 9.0
3 a3 b3 4 10.0
--------------
# 将D列缺失值填充为-999
df.D.fillna('-999')
>> 0       5
   1    -999
   2       9
   3      10
Name: D, dtype: object

方法很简单,但是使用时需要注意一些参数。

  • inplace:可以设置fillna(0, inplace=True),使填充生效,填充原始dataFrame。
  • method:可以设置method 为向前或向后填充,pad/fill为向前填充为向后填充 填充如df.fillna(method=' ffill '),也可以缩写为df.ffill()
df.ffill()
>> A B C D
0 a1 b1 1 5.0
1 a1 b1 2 5.0
2 a2 b2 3 9.0
3 a3 b3 4 10.0

原始缺失值根据之前的值进行填充(B列1行,D列1行)。

除了用前后值填充外,还可以用平均值填充整列,例如用D 8 列中其他缺失值的平均值来填充缺失值。

df.D.fillna(df.D.mean())
>> 0     5.0
   1     8.0
   2     9.0
   3    10.0
Name: D, dtype: float64

6.删除缺失值

删除缺失值不是一种情况。比如是全部删除还是干预程度更高的删除,就看你的承受能力了。真实数据不可避免地会丢失,这是无法避免的。另外,缺席在某些情况下也代表着一定的含义,具体要视情况而定。 ?缺失值大于0.1(即过滤值小于0.1)。

df.loc[:,df.isnull().mean(axis=0) < 0.1]
>> A C
0 a1 1
1 a1 2
2 a2 3
3 a3 4
-------------
# 删除行缺失大于0.1的
df.loc[df.isnull().mean(axis=1) < 0.1]
>> A B C D
0 a1 b1 1 5.0
2 a2 b2 3 9.0
3 a3 b3 4 10.0

7。缺失值参与计算

如果不处理缺失值,按照什么逻辑计算缺失值?

我们看一下不同操作中连接缺失值的逻辑。

1。加法

df
>>A B C D
0 a1 b1 1 5.0
1 a1 None 2 NaN
2 a2 b2 3 9.0
3 a3 b3 4 10.0
---------------
# 对所有列求和
df.sum()
>> A    a1a1a2a3
   C          10
   D          24

您可以看到加法跳过了缺失值。

2。累加

# 对D列进行累加
df.D.cumsum()
>> 0     5.0
   1     NaN
   2    14.0
   3    24.0
Name: D, dtype: float64
---------------
df.D.cumsum(skipna=False)
>> 0    5.0
   1    NaN
   2    NaN
   3    NaN
Name: D, dtype: float64

cumsum 累加会覆盖 NA,但值仍保留在列中。可以使用skipna=False跳过缺失值的计算并返回缺失值。

3。计算

# 对列计数
df.count()
>> A    4
   B    3
   C    4
   D    3
dtype: int64

缺失值不进入计算区域。

4。聚合分组

df.groupby('B').sum()
>> C D
B  
b1 1 5.0
b2 3 9.0
b3 4 10.0
---------------
df.groupby('B',dropna=False).sum()
>> C D
B  
b1 1 5.0
b2 3 9.0
b3 4 10.0
NaN 2 0.0

在聚合过程中默认忽略缺失值。如果希望将缺失值纳入分组,可以设置dropna=False。此用法与 value_counts 等其他用法相同。有时您需要查看缺失值的数量。

以上都是对于缺失值的常见操作,从了解缺失值的三种形式,到缺失值的估计、统计、处理、计数等

来源丨Python数据科学(ID: PyDataScience)

作者/东哥起飞

参考:

[1]pandas简单讲解

[2]https://mp.weixin.qq. com/s/Ool5T49RxYj-Os4DWzTeyQ

版权声明

本文仅代表作者观点,不代表Code前端网立场。
本文系作者Code前端网发表,如需转载,请注明页面地址。

发表评论:

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。

热门