Python pandas.DataFrame 找出含有空值的特定行和列

创建于:20200812
修改于:20200812

1、找出所有含有空值的行

DataFrame[DataFrame.isnull().T.any()]

2、找出含有空值的特定行和列

DataFrame[DataFrame[[‘column3’,‘column4’]].isnull().T.any()][[‘column3’,‘column4’]]

3、代码实例
import pandas as pd
import numpy as np

n = np.arange(20, dtype=float).reshape(5,4)
n[0,0] = np.nan 
n[2,3] = np.nan
n[3,2] = np.nan
index = ['index1', 'index2', 'index3', 'index4', 'index5']
columns = ['column1', 'column2', 'column3', 'column4']
df = pd.DataFrame(data=n, index=index, columns=columns)

print(df)

print(df[df.isnull().T.any()])

print(df[df[['column3','column4']].isnull().T.any()][['column3','column4']])

在这里插入图片描述

4、为什么加转置

非转置:df.isnull().any(),得到的每一列求any()计算的结果,输出为列的Series。

转置:df.isnull().T.any(),得到的每一行求any()计算的结果,输出为行的Series。

5、参考链接

Python-pandas.DataFrame-找出有空值的行

<think> 我们有一个问题:在使用 `pandas.DataFrame(workdata[1:], columns=workdata[0])` 创建DataFrame时,如何处理可能存在的空值? 根据引用,我们知道: - 创建DataFrame时,数据是`workdata[1:]`,名是`workdata[0]`。 - 这里可能存在空值(缺失值)的情况,我们需要在创建过程中或创建后处理这些空值。 处理空值的常见方法包括: 1. 删除包含空值。 2. 填充空值(例如用平均值、中位数、众数或特定值填充)。 3. 在创建DataFrame时,如果数据中有空值pandas默认会将其表示为NaN(对于数值)或None(对于对象类型)。 但是,在创建DataFrame时,我们无法直接通过`pandas.DataFrame`构造函数来处理空值。通常的做法是先创建DataFrame,然后进空值处理。 步骤: 1. 创建DataFrame:`df = pd.DataFrame(workdata[1:], columns=workdata[0])` 2. 检查空值:使用`df.isnull()`或`df.isna()`来检测空值。 3. 处理空值: - 删除:`df.dropna()` 可以删除包含空值(默认)或(通过设置axis参数)。 - 填充:`df.fillna(value)` 用指定值填充空值。 另外,如果数据源(如workdata)是表的表,我们可以在创建DataFrame之前对数据进预处理,比如遍历数据替换空值。但通常使用pandas提供的方法更方便。 示例代码: 假设`workdata`是一个表,其中第一个元素是表,后续元素是数据(每是一个表)。 ```python import pandas as pd import numpy as np # 假设workdata是这样的结构: # workdata = [['1','2','3'], # [1, 2, 3], # [4, None, 6], # [7, 8, 9]] # 创建DataFrame df = pd.DataFrame(workdata[1:], columns=workdata[0]) # 检查空值 print("空值检测:") print(df.isnull()) # 处理空值:这里我们使用填充,用0填充空值(也可以使用其他方法) df_filled = df.fillna(0) # 或者删除包含空值 df_dropped = df.dropna() print("\n填充空值后的DataFrame:") print(df_filled) print("\n删除包含空值后的DataFrame:") print(df_dropped) ``` 注意:`None`在Python中表示空值,在pandas中会被识别为缺失值。另外,如果数据中有字符串'',pandas不会将其识别为缺失值,如果需要,可以先将字符串替换为NaN(使用`df.replace('', np.nan)`),然后再处理。 因此,处理空值的关键步骤是在创建DataFrame之后。用户可以根据需要选择删除或填充。 另外,如果用户希望在创建DataFrame时直接处理空值,那么需要先对原始数据`workdata[1:]`进预处理,例如遍历每一,将空值替换为想要的值。但是,这样做可能不如使用pandas内置函数高效。 总结:在创建DataFrame之后,使用`fillna`或`dropna`来处理空值。 </think>在使用 `pandas.DataFrame(workdata[1:], columns=workdata[0])` 创建DataFrame时,处理空值的最佳方法如下: ### 1. 创建DataFrame后处理空值 ```python import pandas as pd import numpy as np # 创建DataFrame df = pd.DataFrame(workdata[1:], columns=workdata[0]) # 空值处理 df = df.replace('', np.nan) # 将字符串转为NaN df = df.replace('NA', np.nan) # 处理特定标记值 df = df.dropna() # 删除包含空值 # 或 df = df.fillna(0) # 用0填充空值 ``` ### 2. 创建前预处理数据 ```python # 预处理空值 clean_data = [ [cell if cell not in ['', 'NA', None] else np.nan for cell in row] for row in workdata[1:] ] # 创建DataFrame df = pd.DataFrame(clean_data, columns=workdata[0]) # 进一步处理 df = df.dropna(subset=['重要名']) # 仅删除关键空值 ``` ### 3. 指定数据类型优化空值处理 ```python dtype_mapping = { '数值': float, '文本': str, '日期': 'datetime64[ns]' } df = pd.DataFrame( workdata[1:], columns=workdata[0], dtype=object ).astype(dtype_mapping).fillna({ '数值': 0, '文本': '未知' }) ``` ### 关键处理技巧: 1. 使用 `df.isnull()` 检测空值分布 2. `df.dropna()` 参数: - `axis=0`/`1`:删除/(默认) - `thresh=n`:保留至少n个非空值 - `subset=[名]`:指定检查 3. `df.fillna()` 参数: - `method='ffill'/'bfill'`:前向/后向填充 - `value=填充值`:自定义填充值 - `limit=n`:最大填充数量 > **最佳实践**:建议在创建DataFrame后使用链式操作处理空值: > ```python > df = (pd.DataFrame(workdata[1:], columns=workdata[0]) > .replace(['', 'NA', 'N/A'], np.nan) > .dropna(subset=['关键']) > .fillna({'数值': 0, '文本': '缺失'})) > ``` [^1]: 关于DataFrame基本操作 [^2]: DataFrame操作参考 [^3]: DataFrame属性文档 [^4]: DataFrame索引标签 [^5]: DataFrame操作示例
评论 6
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值