如何在Python DataFrame中拼接字符串与变量调用列并生成区间标记列
问题与解决方案
问题描述
假设存在如下结构的Pandas DataFrame:
| ID | Weight | LR Weight | UR Weight | Age | LS Age | US Age | Height | LS Height | US Height |
|---|---|---|---|---|---|---|---|---|---|
| 1 | 63 | 50 | 80 | 20 | 18 | 21 | 165 | 160 | 175 |
| 2 | 75 | 50 | 80 | 22 | 18 | 21 | 172 | 160 | 170 |
| 3 | 49 | 45 | 80 | 17 | 18 | 21 | 180 | 160 | 180 |
需要新增标记列,规则是:若主变量(Weight/Age/Height)的值落在对应上下限区间内(下限≤值≤上限),标记列值为1,否则为0。最终结果如下:
| ID | Flag_Weight | Flag_Age | Flag_Height |
|---|---|---|---|
| 1 | 1 | 1 | 1 |
| 2 | 1 | 0 | 0 |
| 3 | 1 | 0 | 1 |
同时需要了解:在Pandas DataFrame中,如何通过字符串与变量拼接的方式调用列。
解决方案
1. 实现标记列的生成
先构造示例DataFrame,再通过循环遍历主变量,动态匹配对应上下限列生成标记:
import pandas as pd # 构造示例DataFrame data = { "ID": [1,2,3], "Weight": [63,75,49], "LR Weight": [50,50,45], "UR Weight": [80,80,80], "Age": [20,22,17], "LS Age": [18,18,18], "US Age": [21,21,21], "Height": [165,172,180], "LS Height": [160,160,160], "US Height": [175,170,180] } df = pd.DataFrame(data) # 定义主变量与对应上下限前缀的映射 var_bound_prefix = { "Weight": ("LR", "UR"), "Age": ("LS", "US"), "Height": ("LS", "US") } # 循环生成标记列 for var, (lower_prefix, upper_prefix) in var_bound_prefix.items(): # 拼接上下限列名 lower_col = f"{lower_prefix} {var}" upper_col = f"{upper_prefix} {var}" # 判断区间并生成标记值 df[f"Flag_{var}"] = df.apply( lambda row: 1 if (row[lower_col] <= row[var] <= row[upper_col]) else 0, axis=1 ) # 输出目标结果 print(df[["ID", "Flag_Weight", "Flag_Age", "Flag_Height"]])
这种方式可直接扩展到更多主变量和不同前缀的上下限列,无需重复编写判断逻辑。
2. 字符串与变量拼接调用列的方法
在Pandas中,常用两种方式实现字符串拼接调用列:
- 字符串格式化拼接列名:如上述代码中的
f"{lower_prefix} {var}",生成列名字符串后,通过df[列名字符串]即可访问对应列,这是最通用的方式,适配带空格的列名。 getattr方法:若列名无空格,可使用getattr(df, 列名字符串),例如getattr(df, "Weight")等价于df["Weight"]。
如果需要批量处理列,还可以用列表推导式生成目标列名列表,再批量选取:
# 生成所有包含"Weight"的列名 weight_cols = [col for col in df.columns if "Weight" in col] # 批量选取这些列 weight_subset = df[weight_cols]
内容的提问来源于stack exchange,提问作者fcf
相关产品推荐
相关产品推荐

