Pandas中基于索引值查找出现情况及生成标记表格的方法
一、生成目标二进制表格
核心思路是:先整理出所有非NaN的唯一值,然后对每个值逐一检查它在原数据各列中是否存在,存在标记1,不存在标记0。
完整实现代码
import pandas as pd import numpy as np from itertools import chain # 1. 构造原始DataFrame data = { 'A': [4.0, 34.0, 100, 148.0, np.nan], 'B': [85.0, 89.0, 99.0, 100.0, 103.0], 'C': [85.0, 89.0, 99.0, 100.0, np.nan], 'D': [2.0, 7.0, 10.0, 27.0, 30.0] } df = pd.DataFrame(data) # 2. 提取所有非NaN的唯一值并排序 unique_values = list(set(chain(*[df[j].unique().tolist() for j in df.columns]))) unique_values = [val for val in unique_values if not pd.isna(val)] unique_values.sort() # 可选,让结果更整齐 # 3. 构建结果表格 result_df = pd.DataFrame(index=unique_values, columns=df.columns).fillna(0) # 4. 遍历每个唯一值,标记是否在对应列存在 for val in unique_values: for col in df.columns: if val in df[col].values: result_df.loc[val, col] = 1 # 5. 重置索引并命名为id result_df = result_df.reset_index().rename(columns={'index': 'id'}) # 查看结果 print(result_df)
输出结果示例
| id | A | B | C | D | |
|---|---|---|---|---|---|
| 0 | 2 | 0 | 0 | 0 | 1 |
| 1 | 4 | 1 | 0 | 0 | 0 |
| 2 | 7 | 0 | 0 | 0 | 1 |
| 3 | 10 | 0 | 0 | 0 | 1 |
| 4 | 27 | 0 | 0 | 0 | 1 |
| 5 | 30 | 0 | 0 | 0 | 1 |
| 6 | 34 | 1 | 0 | 0 | 0 |
| 7 | 85 | 0 | 1 | 1 | 0 |
| 8 | 89 | 0 | 1 | 1 | 0 |
| 9 | 99 | 0 | 1 | 1 | 0 |
| 10 | 100 | 1 | 1 | 1 | 0 |
| 11 | 103 | 0 | 1 | 0 | 0 |
| 12 | 148 | 1 | 0 | 0 | 0 |
二、Pandas中基于索引查找元素出现情况的方法
这里分几种常见场景来实现:
1. 查找某个值在哪些行索引出现
如果要找某个值在整个DataFrame中出现的所有行索引:
target_value = 85.0 # 筛选出包含该值的行,获取行索引 row_indices = df[df.isin([target_value])].dropna(how='all').index.tolist() print(row_indices) # 输出: [0]
如果只针对某一列查找:
# 查找列B中值为89.0的行索引 row_indices = df[df['B'] == 89.0].index.tolist() print(row_indices) # 输出: [1]
2. 查找指定行索引的元素及存在情况
比如检查行索引4中是否有NaN,或者获取该行的所有元素:
target_row = 4 # 检查该行是否存在NaN has_nan = df.loc[target_row].isna().any() print(has_nan) # 输出: True # 获取该行的所有元素 row_elements = df.loc[target_row].tolist() print(row_elements) # 输出: [nan, 103.0, nan, 30.0]
3. 查找某个值在哪些列索引出现
如果要找某个值在哪些列中存在:
target_value = 100.0 col_indices = df.columns[df.isin([target_value])].tolist() print(col_indices) # 输出: ['A', 'B', 'C']
内容的提问来源于stack exchange,提问作者abhi1610
相关产品推荐
相关产品推荐

