包含列表的字符串数据拆分成多列
要将包含列表的字符串数据拆分成多列,可以按照以下步骤操作:
步骤 1:解析字符串为列表
使用 ast.literal_eval
将字符串安全转换为 Python 列表:
import pandas as pd
import ast
data = {'original_titles': ["['war action', 'comedy romance', 'drama thriller']"]}
df = pd.DataFrame(data)
# 将字符串转换为列表
df['original_titles'] = df['original_titles'].apply(ast.literal_eval)
步骤 2:横向拆分列表为多列
将列表中的每个元素分配到独立的列,并重命名列名:
# 拆分列表为多列
expanded_df = df['original_titles'].apply(pd.Series)
# 重命名列名(original_titles_1, original_titles_2, ...)
expanded_df.columns = [f'original_titles_{i+1}' for i in range(expanded_df.shape[1])]
# 合并回原 DataFrame
df = pd.concat([df.drop('original_titles', axis=1), expanded_df], axis=1)
输出结果
original_titles_1 | original_titles_2 | original_titles_3 |
---|---|---|
war action | comedy romance | drama thriller |
完整代码示例
import pandas as pd
import ast
# 示例数据
data = {'original_titles': ["['war action', 'comedy romance', 'drama thriller']"]}
df = pd.DataFrame(data)
# 1. 将字符串转换为列表
try:
df['original_titles'] = df['original_titles'].apply(ast.literal_eval)
except SyntaxError:
# 若格式不标准,手动处理(例如去除多余符号后拆分)
df['original_titles'] = (
df['original_titles']
.str.replace(r"[\[\]']", "", regex=True)
.str.split(', ')
)
# 2. 横向拆分为多列
expanded_df = df['original_titles'].apply(pd.Series)
expanded_df.columns = [f'original_titles_{i+1}' for i in range(expanded_df.shape[1])]
# 3. 合并结果
df = pd.concat([df.drop('original_titles', axis=1), expanded_df], axis=1)
print(df)
处理异常情况
-
字符串格式错误:
如果原始字符串的格式不标准(如缺少引号或括号),可以使用正则表达式清洗数据:df['original_titles'] = ( df['original_titles'] .str.replace(r"[\[\]']", "", regex=True) # 删除 [ ] 和引号 .str.split(', ') # 按逗号和空格拆分 )
-
列表长度不一致:
若某些行的列表较短,生成的列会自动填充NaN
,例如:data = {'original_titles': ["['war action', 'comedy romance']", "['drama thriller']"]}
输出结果为:
original_titles_1 original_titles_2 original_titles_3 war action comedy romance NaN drama thriller NaN NaN
总结
- 横向拆分:适合按顺序保留元素(如标题的主次顺序)。
- 异常处理:确保数据格式统一,必要时手动清洗。
- 灵活性:
apply(pd.Series)
自动处理不同长度的列表,用NaN
填充缺失值。