如何提取DataFrame每行最后N个非空单元格并筛选指定字符内容
Pandas DataFrame 处理方案
任务1:提取每行最后3个非空单元格
实现思路
遍历DataFrame的每一行,先过滤空值,再截取最后3个元素;若该行非空元素不足3个,用空值补全至3个,最后整理成指定结构的结果表。
代码实现
import pandas as pd import numpy as np # 模拟原始数据(替换为你的实际数据即可) raw_data = { "水果1": ["Apple", "Pear", "Orange", "Mango"], "水果2": ["Banana", np.nan, "Grape", np.nan], "水果3": ["Grape", np.nan, "Peach", "Guava"], "水果4": [np.nan, np.nan, "Plum", np.nan], "水果5": [np.nan, np.nan, np.nan, np.nan] } df = pd.DataFrame(raw_data) # 定义函数提取每行最后3个非空值 def extract_last_three(row): non_null_vals = row.dropna().tolist() # 截取最后3个,不足则补空值 target_vals = non_null_vals[-3:] return target_vals + [np.nan] * (3 - len(target_vals)) # 生成结果表 result_task1 = df.apply(extract_last_three, axis=1, result_type="expand") result_task1.columns = ["最后第3个", "最后第2个", "最后第1个"] print(result_task1)
预期输出
| 最后第3个 | 最后第2个 | 最后第1个 |
|---|---|---|
| Apple | Banana | Grape |
| NaN | NaN | Pear |
| Grape | Peach | Plum |
| NaN | Mango | Guava |
任务2:筛选包含字符G或P的水果数据
实现思路
有两种常见处理方式:一是提取所有非空水果数据后,筛选名称含G或P(不区分大小写)的条目;二是直接筛选原始DataFrame中至少有一个符合条件水果的行,按需选择即可。
代码实现
# 方式1:提取所有符合条件的水果条目 all_non_null_fruits = df.stack().reset_index(drop=True) filtered_fruits = all_non_null_fruits[all_non_null_fruits.str.contains(r'[GP]', case=False)] result_task2 = pd.DataFrame(filtered_fruits, columns=["符合条件的水果"]) # 方式2:筛选原始DataFrame中至少有一个符合条件水果的行 def has_target_char(row): non_null_vals = row.dropna().tolist() return any('G' in fruit.upper() or 'P' in fruit.upper() for fruit in non_null_vals) filtered_rows = df[df.apply(has_target_char, axis=1)]
预期输出(方式1)
| 符合条件的水果 |
|---|
| Grape |
| Pear |
| Grape |
| Peach |
| Plum |
| Guava |
内容的提问来源于stack exchange,提问作者Storm
相关产品推荐
相关产品推荐

