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