如何基于DataFrame的num_type_len与Actual_num列创建Report_length列
问题描述
需要在Pandas DataFrame中创建Report_length列,逻辑为:匹配num_type_len列列表元素的前缀编号(下划线前的数字)与Actual_num列数值,提取对应元素的后缀长度(最后一个下划线后的数字)。
原始数据:
| num_type_len | Actual_num |
|---|---|
| [8812_CHECKING_90, 7094_SAVINGS_75, 9939_CHECKING_89] | 7094 |
| [6846_CHECKING_87, 1906_CHECKING_90] | 1906 |
预期输出:
| Report_length | Actual_num |
|---|---|
| 75 | 7094 |
| 90 | 1906 |
解决方案
可以通过Pandas的apply函数结合自定义逻辑实现,以下是具体代码:
import pandas as pd # 构造原始DataFrame data = { 'num_type_len': [ ['8812_CHECKING_90', '7094_SAVINGS_75', '9939_CHECKING_89'], ['6846_CHECKING_87', '1906_CHECKING_90'] ], 'Actual_num': [7094, 1906] } df = pd.DataFrame(data) # 自定义函数提取匹配的长度值 def extract_length(row): target = str(row['Actual_num']) for item in row['num_type_len']: parts = item.split('_') if parts[0] == target: return parts[-1] return None # 无匹配项时返回None # 生成Report_length列 df['Report_length'] = df.apply(extract_length, axis=1) # 筛选出目标列 result = df[['Report_length', 'Actual_num']] print(result)
代码说明
- 先构造原始数据的DataFrame;
extract_length函数遍历每行的num_type_len列表,将每个元素按下划线分割,对比前缀编号与Actual_num,匹配后返回最后一段的长度值;- 用
apply逐行执行函数生成新列,最后保留需要的两列即可得到预期结果。
如果追求更简洁的写法,也可以用lambda表达式结合生成器:
df['Report_length'] = df.apply( lambda r: next((i.split('_')[-1] for i in r['num_type_len'] if i.split('_')[0] == str(r['Actual_num'])), None), axis=1 )
内容的提问来源于stack exchange,提问作者Swetha
相关产品推荐
相关产品推荐

