PYTHON:pandas完整的缺失值处理(附代码)
pandas处理缺失值的手册!
1。缺失值类型
在pandas
中,缺失数据显示为NaN。缺失值可以通过三种方式呈现:np.nan
、none
、pd.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
才是不变的,所以可以认为如果不是人为命名 开发者也注意到了这一点。对于不同的数据类型使用不同的缺失值表示是非常混乱的。 pd.NA 的存在是为了一致性。 pd.NA 的目标是提供一个缺失值检测器,可以在许多不同的数据类型中一致使用(而不是在使用 np.nan、None 或 NaT 时临时使用)。 同样,布尔类型和字符类型的原始数据类型不变。这样就解决了每次都换成 以下是pd.NA中常见算术运算和比较运算的示例: 了解了缺失值的各种形式后,我们需要知道如何估计缺失值。在 通常我们会对 列 但在许多情况下,我们还需要为该行 制作缺失值 。例如,数据线可能没有单个值。如果这个样本进入模型,将会造成较大的干扰。因此,通常会检查并计算行价格和缺失行价格。 功能很简单,只需将 有时我不仅仅想知道缺失物品的数量,还想知道缺失物品的比例,即缺失的金额。通常,您可以考虑上面获得的值并将其与总行数进行比较。但实际上这里有一个可以一步完成的小技巧。 过滤需要执行 loc 代码。行和列的缺失过滤如下: 如果要查询没有缺失值的行和列,可以使表达式 我们通常有两种处理缺失值的方式,一种是直接删除,另一种是保留并填充。我们先介绍填充方法 方法很简单,但是使用时需要注意一些参数。 原始缺失值根据之前的值进行填充(B列1行,D列1行)。 除了用前后值填充外,还可以用平均值填充整列,例如用D 8 列中其他缺失值的平均值来填充缺失值。 删除缺失值不是一种情况。比如是全部删除还是干预程度更高的删除,就看你的承受能力了。真实数据不可避免地会丢失,这是无法避免的。另外,缺席在某些情况下也代表着一定的含义,具体要视情况而定。 ?缺失值大于0.1(即过滤值小于0.1)。 如果不处理缺失值,按照什么逻辑计算缺失值? 我们看一下不同操作中连接缺失值的逻辑。 1。加法 您可以看到加法跳过了缺失值。 2。累加 3。计算 缺失值不进入计算区域。 4。聚合分组 在聚合过程中默认忽略缺失值。如果希望将缺失值纳入分组,可以设置 以上都是对于缺失值的常见操作,从了解缺失值的三种形式,到缺失值的估计、统计、处理、计数等 来源丨Python数据科学(ID: PyDataScience) 作者/东哥起飞 参考: [1]pandas简单讲解 [2]https://mp.weixin.qq. com/s/Ool5T49RxYj-Os4DWzTeyQ没什么
没有原则上不是pandas
,所以Nothing
几乎对每个人来说都是看不见的。 ?处于试用阶段。 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 + 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。缺失值过滤
# 筛选有缺失值的行
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
fillna(0, inplace=True)
,使填充生效,填充原始dataFrame。 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
df.D.fillna(df.D.mean())
>> 0 5.0
1 8.0
2 9.0
3 10.0
Name: D, dtype: float64
6.删除缺失值
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。缺失值参与计算
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
# 对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
跳过缺失值的计算并返回缺失值。 # 对列计数
df.count()
>> A 4
B 3
C 4
D 3
dtype: int64
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
等其他用法相同。有时您需要查看缺失值的数量。
版权声明
本文仅代表作者观点,不代表Code前端网立场。
本文系作者Code前端网发表,如需转载,请注明页面地址。
发表评论:
◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。