如何在Pandas可变结构DataFrame中为每个FlexColumn插入前置规则列
解决方案:动态为FlexColumn列前置新增判断列
针对你这个结构可变的DataFrame需求,用Pandas就能轻松搞定,下面是一步步的具体实现:
1. 需求拆解先理清
- 前两列
A、B固定,后续列均以FlexColumn开头,数量不固定 - 每个
FlexColumnX前插入新列FlexColumnX_myEnding - 新列值规则:
- 原列内容包含
1/1→norm - 包含
0/1→half - 两者都不包含 →
not_known
- 原列内容包含
2. 完整代码实现
import pandas as pd import numpy as np # 初始化示例DataFrame data = { 'A': ['Apples', 'Apples'], 'B': ['Pears', 'Apples'], 'FlexColumnA': ['0/1;23;45;67', '0/0;24;26;27'], 'FlexColumnB': ['1/1;23;45;67', '0/1;27;28;29'] } df = pd.DataFrame(data) # 定义常量后缀 my_ending = 'myEnding' # 筛选所有以FlexColumn开头的列(自动适配后续新增的同规则列) flex_columns = [col for col in df.columns if col.startswith('FlexColumn')] # 遍历每个Flex列,插入对应的判断列 for col in flex_columns: # 获取当前Flex列在DataFrame中的索引位置,确保新列插在它前面 insert_position = df.columns.get_loc(col) # 生成新列的判断值:优先匹配'1/1',再匹配'0/1',其余归为not_known new_col_values = np.where( df[col].str.contains('1/1'), 'norm', np.where(df[col].str.contains('0/1'), 'half', 'not_known') ) # 插入新列,动态拼接列名 df.insert(insert_position, f"{col}_{my_ending}", new_col_values) # 查看最终结果 print(df)
3. 关键逻辑解释
- 自动适配可变列:用列表推导式筛选Flex列,不管后续新增多少个同规则列,都能自动处理
- 精准插入位置:通过
get_loc获取列索引,保证新列刚好插在对应Flex列的前面 - 高效多条件判断:用
np.where嵌套实现三层逻辑,比apply更适合批量数据处理,速度更快 - 动态列名生成:用f-string拼接原列名和后缀,完全符合命名要求
4. 运行结果
执行后会得到你期望的DataFrame:
A B FlexColumnA_myEnding FlexColumnA FlexColumnB_myEnding FlexColumnB 0 Apples Pears half 0/1;23;45;67 norm 1/1;23;45;67 1 Apples Apples not_known 0/0;24;26;27 half 0/1;27;28;29
内容的提问来源于stack exchange,提问作者user123
相关产品推荐
相关产品推荐

