如何统计DataFrame各列数值、空白、NaN及文本值并按条件筛选
Pandas 实现DataFrame列类型统计与筛选(对应Excel ISNUMBER/ISTEXT功能)
先构造你提供的示例数据:
import pandas as pd import numpy as np data = { 'Col1': [10.5, '', 2.9, '#VAL', 3], 'Col2': [2.5, 's', 3.2, np.nan, 5.6], 'Col3': [np.nan, '', 'a', 2, 4] } df = pd.DataFrame(data)
一、生成类型统计汇总表
我们可以通过逐列判定单元格类型,统计各类数量后组合成目标汇总表,对应Excel中ISNUMBER、ISTEXT、COUNTBLANK等函数的逻辑。
1. 明确类型判定规则
- NaN: 用
pd.isna()识别缺失值 - Blank: 空字符串
'',需排除NaN(pd.isna('')返回False) - Integer/Float: 可转换为数值的单元格(含原生数值类型、可转数值的字符串)
- Text: 不属于上述三类的单元格(如
#VAL、s这类无法转数值的字符串)
2. 统计代码实现
# 初始化统计结果字典 summary = { 'Integer/Float': [], 'Blank': [], 'Nan': [], 'Text': [] } for col in df.columns: # 统计NaN数量 nan_count = df[col].isna().sum() # 统计Blank数量 blank_count = (df[col] == '').sum() # 统计可转为数值的单元格数量:先排除NaN和Blank,再尝试转换 valid_cells = df[col][~df[col].isna() & (df[col] != '')] num_count = pd.to_numeric(valid_cells, errors='coerce').notna().sum() # 文本数量 = 总行数 - 其他三类数量 text_count = len(df) - nan_count - blank_count - num_count # 存入统计结果 summary['Integer/Float'].append(num_count) summary['Blank'].append(blank_count) summary['Nan'].append(nan_count) summary['Text'].append(text_count) # 转换为目标格式的汇总DataFrame summary_df = pd.DataFrame(summary, index=df.columns).T print(summary_df)
运行后输出结果与你期望的汇总表完全一致:
Col1 Col2 Col3 Integer/Float 3 3 2 Blank 1 0 1 Nan 0 1 1 Text 1 1 1
二、按类型筛选单元格
1. 筛选文本值(以Col1为例)
text_col1 = df.loc[ ~df['Col1'].isna() & (df['Col1'] != '') & pd.to_numeric(df['Col1'], errors='coerce').isna(), 'Col1' ] # 输出:3 #VAL # Name: Col1, dtype: object
2. 筛选数值(Integer/Float,以Col3为例)
num_col3 = df.loc[ pd.to_numeric(df['Col3'], errors='coerce').notna(), 'Col3' ] # 输出:3 2 # 4 4 # Name: Col3, dtype: object
3. 筛选Blank或NaN(以Col2为例)
blank_nan_col2 = df.loc[df['Col2'].isna() | (df['Col2'] == ''), 'Col2'] # 输出:3 NaN # Name: Col2, dtype: object
内容的提问来源于stack exchange,提问作者x0nar
相关产品推荐
相关产品推荐

