如何基于Pandas列表列按位置动态生成提取后的新列?
解决方案
可以通过Pandas的apply和DataFrame.tolist()方法高效实现需求,无需手动循环初始化列,步骤如下:
- 处理
banking_number列的每个列表:对列表内元素,若为字符串'NaN'则保留,否则提取前两位字符; - 将处理后的列表转换为新的DataFrame,自动为长度不足的列表补全缺失值;
- 拼接原DataFrame与新生成的银行编号列,最后统一将缺失值替换为字符串
'NaN'。
完整代码
import pandas as pd import numpy as np # 初始化原始数据 df = pd.DataFrame({ 'first_name': ['Charles', 'Charles2', 'Charles3'], 'last_name': ['George', 'George2', 'George3'], 'banking_number': [['NaN'], ['UK421'], ['UK123', 'FR789']] }) # 处理每个银行编号列表:提取前两位,特殊保留'NaN' processed_banks = df['banking_number'].apply( lambda x: [item if item == 'NaN' else item[:2] for item in x] if pd.notna(x) else [] ) # 将处理后的列表转为DataFrame,自动补全缺失值,设置列名 max_bank_count = processed_banks.str.len().max() bank_columns = pd.DataFrame( processed_banks.tolist(), columns=[f'bank_{i+1}' for i in range(max_bank_count)] ) # 拼接原数据与新列,填充缺失值为'NaN'字符串 df_final = pd.concat([df, bank_columns], axis=1).fillna('NaN') print(df_final)
输出结果
first_name last_name banking_number bank_1 bank_2 0 Charles George [NaN] NaN NaN 1 Charles2 George2 [UK421] UK NaN 2 Charles3 George3 [UK123, FR789] UK FR
内容的提问来源于stack exchange,提问作者Hugoz13
相关产品推荐
相关产品推荐

