如何将pandas DataFrame中含嵌套列表的列拆分为多个独立列
实现方案
核心思路
先将字符串格式的嵌套列表转为Python原生列表结构,再扁平化嵌套内容、拆分字段,最后生成随机列名输出为新列。
完整实现代码
步骤1:导入依赖库
import pandas as pd import ast import random import string
步骤2:处理字符串转嵌套列表
首先把X列的字符串格式内容转为实际的嵌套列表结构:
# 示例数据初始化 df = pd.DataFrame({"X": {0: "[['ClinicalTrials.gov Identifier: NCT05105893'], ['Recruitment Status : Completed First Posted : November 3, 2021 Last Update Posted : November 3, 2021']]"}}) # 字符串转原生嵌套列表,比eval更安全 df['X_list'] = df['X'].apply(ast.literal_eval)
步骤3:扁平化嵌套内容、拆分字段
自定义函数处理嵌套结构,同时按两个空格拆分同一项内的多个独立字段:
def flatten_content(nested_list): result = [] for sub_lst in nested_list: for item in sub_lst: # 按两个空格拆分同一条目中的多个字段,可根据实际分隔符调整规则 result.extend([i.strip() for i in item.split(' ') if i.strip()]) return result df['flat_content'] = df['X_list'].apply(flatten_content)
步骤4:拆分为新列并生成随机列名
# 计算所有行中最长的字段数,确定需要生成的列数 max_col_num = df['flat_content'].apply(len).max() # 生成列名(两种方案二选一) # 方案1:和示例一致的rand+序号格式列名 col_names = [f'rand{i+1}' for i in range(max_col_num)] # 方案2:完全随机的6位字符列名 # col_names = [''.join(random.choices(string.ascii_letters + string.digits, k=6)) for _ in range(max_col_num)] # 拆分列表为独立列,合并回原数据表 split_cols = pd.DataFrame(df['flat_content'].tolist(), columns=col_names, index=df.index) final_df = pd.concat([df[['X']], split_cols], axis=1)
注意事项
- 不同行的嵌套列表长度不一致时,长度不足的行对应列会自动填充
NaN - 如果字段分隔符不是两个空格,可修改
split方法的参数适配实际数据规则 - 若不需要保留原X列,可在
pd.concat时去掉df[['X']]部分
内容的提问来源于stack exchange,提问作者Saad Zaheer
相关产品推荐
相关产品推荐

