首页 > 解决方案 > 使用 pandas 获取重复统计信息(如缺失值)的优雅方法

问题描述

我有一个如下所示的数据框

df = pd.DataFrame({'subject_id': [101,101,np.nan,201,202],
                  'test_id':['A1','A1','A3',np.nan,'A4']})

这在数据框中既有缺失值又有重复值

我想获得跨列缺失值和重复值的统计信息。

当我尝试以下内容时,它适用于丢失的列

percent_missing = df.isna().sum() * 100 / len(df)
pd.DataFrame({'column_name': df.columns,
              'percent_missing': percent_missing})

在此处输入图像描述

但是对于重复项,我想像上面那样写,但这显然是不正确的。它不会按列返回我的输出(而是为我提供数据帧级别)

我不能使用,因为我想像上面使用 isna()subset一样一次检查所有列中的重复值missing

percent_duplicates = df.duplicated().sum() * 100 / len(df)
pd.DataFrame({'column_name': df.columns,
              'percent_duplicates': percent_duplicates})

我希望我的输出如下所示

在此处输入图像描述

标签: pythonpandasdataframenumpypandas-groupby

解决方案


您可以使用列表推导:

df_len = len(df)
percent_duplicates = [df[col].duplicated(keep=False).sum() * 100 / df_len
                      for col in df]

或与apply

percent_duplicates = df.apply(lambda col:
                              col.duplicated(keep=False).sum() * 100 / df_len)

我们在哪里通过keep=False,以便所有重复项都标记为True

要得到

>>> pd.DataFrame({"column_name": df.columns,
                  "percent_duplicates": percent_duplicates})

  column_name  percent_duplicates
0  subject_id                40.0
1     test_id                40.0

推荐阅读