Python 获取数据帧中每个要素的错误值行百分比的最快方法

Python 获取数据帧中每个要素的错误值行百分比的最快方法,python,pandas,dataframe,optimization,data-wrangling,Python,Pandas,Dataframe,Optimization,Data Wrangling,下面的代码是我所拥有的。似乎适用于?,“和”,但不适用于np.NaN。有什么建议吗 另外,我还不熟悉Pandas/Python,因此想知道是否有更快的方法来实现这一点 如果超过X%(比如说5%)的行缺少值,我会考虑将特征视为可疑。您经常使用的任何其他数据清理初始检查 for col in df.columns: pcnt_missing = df[df[col].isin(['?','',' ',np.NaN])][col].count() * 100.0 / df[col].count()

下面的代码是我所拥有的。似乎适用于
?,“
,但不适用于
np.NaN
。有什么建议吗

另外,我还不熟悉Pandas/Python,因此想知道是否有更快的方法来实现这一点

如果超过X%(比如说5%)的行缺少值,我会考虑将特征视为可疑。您经常使用的任何其他数据清理初始检查

for col in df.columns:
  pcnt_missing = df[df[col].isin(['?','',' ',np.NaN])][col].count() * 100.0 / df[col].count()
  if pcnt_missing > 1:
    print(f"Col = {col}, Percent missing ={pcnt_missing:.2f}")

如果可以用
np.nan
替换值
'
'
,则可以使用
总和和数据帧的长度轻松计算缺失值的百分比。您可以使用
应用
替换缺少的值:

import pandas as pd
import numpy as np

df = pd.DataFrame({'a': [1,2,3,4], 'b': [2, '', '?', 4], 'c': [' ', np.nan, '', 5]})

def replace(x):
    idx = x.isin(['', ' ', '?'])
    x[idx] = np.nan
    return x

replaced = df.apply(replace, axis=1) % Values are replaced here
现在,您可以使用以下公式计算每列缺少值的百分比:

replaced.isna().sum(axis=0) * 100 / len(replaced)

Output:

a     0.0
b    50.0
c    75.0
dtype: float64

如果可以用
np.nan
替换值
'
'
,则可以使用
总和和数据帧的长度轻松计算缺失值的百分比。您可以使用
应用
替换缺少的值:

import pandas as pd
import numpy as np

df = pd.DataFrame({'a': [1,2,3,4], 'b': [2, '', '?', 4], 'c': [' ', np.nan, '', 5]})

def replace(x):
    idx = x.isin(['', ' ', '?'])
    x[idx] = np.nan
    return x

replaced = df.apply(replace, axis=1) % Values are replaced here
现在,您可以使用以下公式计算每列缺少值的百分比:

replaced.isna().sum(axis=0) * 100 / len(replaced)

Output:

a     0.0
b    50.0
c    75.0
dtype: float64

使用@Ricardo Erikson设置将布尔逻辑与isna一起使用:

df = pd.DataFrame({'a': [1,2,3,4], 'b': [2, '', '?', 4], 'c': [' ', np.nan, '', 5]})

(df.isna() | df.isin(['?','',' '])).mean()
输出:

a    0.00
b    0.50
c    0.75
dtype: float64

使用
isna
检查NaN,并使用
或布尔运算符,以及使用
isin
,此外,您还可以使用
mean
查找缺失的百分比。

使用布尔逻辑和
isna
,使用@Ricardo Erikson设置:

df = pd.DataFrame({'a': [1,2,3,4], 'b': [2, '', '?', 4], 'c': [' ', np.nan, '', 5]})

(df.isna() | df.isin(['?','',' '])).mean()
输出:

a    0.00
b    0.50
c    0.75
dtype: float64

使用
isna
检查NaN,并使用
|
或布尔运算符,使用
isin
,此外,您还可以使用
mean
查找缺少的百分比。

我想您应该检查一下。此外,在使用
pandas
时,您应该尽量避免
for
循环,因为当您使用
pandas
方法时,它们通常在C上运行。@FelipeWhitaker
dropna
有几个问题不符合我的目的1。不会为?,''&''工作。我可以先用NaN替换?、“”等,但这会带来问题2、3和2。仍然必须运行某种for循环,以仅忽略具有大量缺失值的功能。我想我可以试试
df.apply()。3. <
dropna
中的code>thresh
是绝对值,而不是百分比值。因此,我仍然需要使用count手动计算,我认为您应该检查一下。此外,在使用
pandas
时,您应该尽量避免
for
循环,因为当您使用
pandas
方法时,它们通常在C上运行。@FelipeWhitaker
dropna
有几个问题不符合我的目的1。不会为?,''&''工作。我可以先用NaN替换?、“”等,但这会带来问题2、3和2。仍然必须运行某种for循环,以仅忽略具有大量缺失值的功能。我想我可以试试
df.apply()。3. <
dropna
中的code>thresh
是绝对值,而不是百分比值。因此,我仍然必须使用count手动计算它