Pandas dropna()–从DataFrame中删除Null/NA值

时间:2020-02-23 14:42:07  来源:igfitidea点击:

1. Pandas DataFrame dropna()函数

Pandas DataFrame dropna()函数用于删除具有Null/NaN值的行和列。
默认情况下,此函数返回一个新的DataFrame,而源DataFrame保持不变。

我们可以使用None,pandas.NaT和numpy.nan变量创建空值。

dropna()函数的语法为:

dropna(self, axis=0, how="any", thresh=None, subset=None, inplace=False)
  • 轴:可能的值为{0或者'index',1或者'columns'},默认值为0。
    如果为0,则删除具有空值的行。
    如果为1,则删除缺少值的列。

  • 方式:可能的值为{'any','all'},默认为'any'。
    如果为" any",则在任何值为null的情况下删除行/列。
    如果为"全部",则在缺少所有值的情况下删除行/列。

  • thresh:一个整数值,用于指定放置操作的阈值。

  • 子集:指定要查找空值的行/列。

  • inplace:布尔值。
    如果为True,则更改源DataFrame,并返回None。

让我们看一些使用dropna()函数的示例。

2.Pandas 使用任何Null/NaN/NaT值删除所有行

这是dropna()函数的默认行为。

import pandas as pd
import numpy as np

d1 = {'Name': ['hyman', 'Meghna', 'David', 'Lisa'], 'ID': [1, 2, 3, 4], 'Salary': [100, 200, np.nan, pd.NaT],
    'Role': ['CEO', None, pd.NaT, pd.NaT]}

df = pd.DataFrame(d1)

print(df)

# drop all rows with any NaN and NaT values
df1 = df.dropna()
print(df1)

输出:

Name  ID Salary Role
0  hyman   1    100  CEO
1  Meghna   2    200  None
2   David   3    NaN  NaT
3    Lisa   4    NaT  NaT

   Name  ID Salary Role
0  hyman   1    100  CEO

3.删除所有缺少任何值的列

我们可以传递" axis = 1"来删除缺少值的列。

df1 = df.dropna(axis=1)
print(df1)

输出:

Name  ID
0  hyman   1
1  Meghna   2
2   David   3
3    Lisa   4

4.仅当所有值都为空时才删除行/列

import pandas as pd
import numpy as np

d1 = {'Name': ['hyman', 'Meghna', 'David', pd.NaT], 'ID': [1, 2, 3, pd.NaT], 'Salary': [100, 200, np.nan, pd.NaT],
    'Role': [np.nan, np.nan, pd.NaT, pd.NaT]}

df = pd.DataFrame(d1)

print(df)

df1 = df.dropna(how='all')
print(df1)

df1 = df.dropna(how='all', axis=1)
print(df1)

输出:

Name   ID Salary Role
0  hyman    1    100  NaT
1  Meghna    2    200  NaT
2   David    3    NaN  NaT
3     NaT  NaT    NaT  NaT

   Name ID Salary Role
0  hyman  1    100  NaT
1  Meghna  2    200  NaT
2   David  3    NaN  NaT

   Name   ID Salary
0  hyman    1    100
1  Meghna    2    200
2   David    3    NaN
3     NaT  NaT    NaT

5.超过空值的阈值时,DataFrame删除行/列

import pandas as pd
import numpy as np

d1 = {'Name': ['hyman', 'Meghna', 'David', pd.NaT], 'ID': [1, 2, pd.NaT, pd.NaT], 'Salary': [100, 200, np.nan, pd.NaT],
    'Role': [np.nan, np.nan, pd.NaT, pd.NaT]}

df = pd.DataFrame(d1)

print(df)

df1 = df.dropna(thresh=2)
print(df1)

输出:

Name   ID Salary Role
0  hyman    1    100  NaT
1  Meghna    2    200  NaT
2   David  NaT    NaN  NaT
3     NaT  NaT    NaT  NaT

   Name ID Salary Role
0  hyman  1    100  NaT
1  Meghna  2    200  NaT

具有2个或者更多空值的行将被删除。

6.定义标签以查找空值

import pandas as pd
import numpy as np

d1 = {'Name': ['hyman', 'Meghna', 'David', 'Lisa'], 'ID': [1, 2, 3, pd.NaT], 'Salary': [100, 200, np.nan, pd.NaT],
    'Role': ['CEO', np.nan, pd.NaT, pd.NaT]}

df = pd.DataFrame(d1)

print(df)

df1 = df.dropna(subset=['ID'])
print(df1)

输出:

Name   ID Salary Role
0  hyman    1    100  CEO
1  Meghna    2    200  NaN
2   David    3    NaN  NaT
3    Lisa  NaT    NaT  NaT

   Name ID Salary Role
0  hyman  1    100  CEO
1  Meghna  2    200  NaN
2   David  3    NaN  NaT

从DataFrame中删除列时,我们可以在子集中指定索引值。

df1 = df.dropna(subset=[1, 2], axis=1)
print(df1)

输出:

Name   ID
0  hyman    1
1  Meghna    2
2   David    3
3    Lisa  NaT

由于缺少的值仅在索引1和2中查找,因此不会删除" ID"列。

7.放行,NA不存在

我们可以通过inplace = True来更改源DataFrame本身。
当DataFrame很大并且我们想节省一些内存时,这很有用。

import pandas as pd

d1 = {'Name': ['hyman', 'Meghna'], 'ID': [1, 2], 'Salary': [100, pd.NaT]}

df = pd.DataFrame(d1)

print(df)

df.dropna(inplace=True)
print(df)

输出:

Name  ID  Salary
0  hyman   1   100.0
1  Meghna   2     NaN

   Name  ID  Salary
0  hyman   1   100.0