如何将DataFrame列表列元素拆分生成新列?解决索引越界问题
拆分DataFrame列表列生成多列的解决方案
场景与需求
原始DataFrame:
| keywords |
|---|
| [(caused patient, 0.4807), (wa non, 0.1332), (2021, -0.0076)] |
| [(incorrect reconstitution, 0.9084), (error, 0.5304), (incorrect, 0.2877)] |
需要把keywords列(每行是含3个元组的列表)拆成keyword_1、keyword_2、keyword_3三列,最终结果如下:
| keyword_1 | keyword_2 | keyword_3 |
|---|---|---|
| (caused patient, 0.4807) | (wa non, 0.1332) | (2021, -0.0076) |
| (incorrect reconstitution, 0.9084) | (error, 0.5304) | (incorrect, 0.2877) |
错误代码及报错
尝试的代码:
new_col_list = ['first_keyword', 'second_keyword','third_keyword'] for n,col in enumerate(new_col_list): df[col] = df['keywords'].apply(lambda keywords: keywords[n]) df = df('keywords',axis=1)
执行报错:IndexError: list index out of range
问题分析与解决方法
问题点
- 循环里直接用
keywords[n]取值,一旦某行的keywords列表长度不够3,就会触发索引越界; - 最后一行删除列的语法错误,应该用
df.drop()而不是直接调用df()。
正确实现方式
方式一:高效展开列表(推荐)
利用pd.DataFrame直接把列表列拆成多列,这是最简洁高效的方法:
import pandas as pd # 将keywords列的列表元素直接转为新DataFrame,指定列名 expanded_cols = pd.DataFrame(df['keywords'].tolist(), columns=['keyword_1', 'keyword_2', 'keyword_3']) # 合并原DataFrame并删除原keywords列 result_df = pd.concat([df.drop('keywords', axis=1), expanded_cols], axis=1)
方式二:修复原循环代码
如果要保留循环逻辑,需要增加长度判断避免索引越界,同时修正删除列的语法:
new_col_list = ['keyword_1', 'keyword_2','keyword_3'] for n, col in enumerate(new_col_list): # 先判断列表长度,不足时填充None df[col] = df['keywords'].apply(lambda x: x[n] if len(x) > n else None) # 正确删除keywords列 df = df.drop('keywords', axis=1)
两种方法都能得到预期的DataFrame结构,方式一处理大数据量时效率更高。
内容的提问来源于stack exchange,提问作者brins
相关产品推荐
相关产品推荐

