如何使用Pandas遍历列唯一值,检查另一列并生成新列?
实现思路与代码方案
方案一:补全你现有循环逻辑
你已经拿到了ID的唯一值列表,接下来可以通过以下步骤完成需求:
- 创建字典存储每个ID是否存在Status为'A'的判断结果
- 遍历每个唯一ID,筛选对应行并检查是否包含'A'
- 用
map将字典映射到原DataFrame的ID列,生成新列
补全后的代码:
def function(df): id_list = df['ID'].unique() id_has_a = {} for i in id_list: # 筛选当前ID的所有行,判断是否存在Status为'A'的记录 has_a = (df[df['ID'] == i]['Status'] == 'A').any() id_has_a[i] = 'YES' if has_a else 'NO' # 生成新列 df['Result A?'] = df['ID'].map(id_has_a) return df
方案二:更高效的Pandas原生方法(推荐)
手动循环在处理大数据量时效率较低,推荐使用Pandas的groupby+transform实现向量化操作,代码更简洁且性能更好:
def function(df): # 按ID分组,对每组的Status列判断是否存在'A',并将结果广播到组内每一行 df['Result A?'] = df.groupby('ID')['Status'].transform( lambda group: 'YES' if (group == 'A').any() else 'NO' ) return df
验证示例
假设原DataFrame为:
import pandas as pd df = pd.DataFrame({ 'ID': [1, 1, 2, 2], 'Status': ['A', 'B', 'B', 'C'] })
调用上述任意函数后,得到的结果如下:
| ID | Status | Result A? |
|---|---|---|
| 1 | A | YES |
| 1 | B | YES |
| 2 | B | NO |
| 2 | C | NO |
内容的提问来源于stack exchange,提问作者keo
相关产品推荐
相关产品推荐

