如何将非1NF的Pandas数据集转换为符合1NF的DataFrame?
多值属性转1NF格式DataFrame的解决方案
原代码存在的问题
- 多列索引语法错误:
df['singer','language']应改为df[['singer', 'language']],但核心问题是未先拆分分号分隔的字符串。 - 未处理多值字符串:直接使用
df['singer'].values是原始字符串,无法直接用np.concatenate拆分展开。 - 长度计算逻辑错误:
lens计算的是原始字符串长度,而非拆分后多值元素的数量,导致np.repeat无法匹配正确的行数。
修正后的代码
import pandas as pd # 读取原始数据集 df = pd.read_csv("music.csv") # 将分号分隔的多值列拆分为列表 df['singer'] = df['singer'].str.split(';') df['language'] = df['language'].str.split(';') # 同时展开多值列,确保数据关联关系正确,生成符合1NF的DataFrame normalized_df = df.explode(['singer', 'language'], ignore_index=True) # 可选:清除属性值前后的空格(若原始数据分号后带空格) normalized_df['singer'] = normalized_df['singer'].str.strip() normalized_df['language'] = normalized_df['language'].str.strip() print(normalized_df)
代码说明
str.split(';'):把分号分隔的多值字符串转换为列表,为后续展开做准备。explode(['singer', 'language']):将列表类型的列展开为多行,且会保证同一行的singer和language列表元素一一对应,避免数据错位。ignore_index=True:重置展开后的索引,让索引连续有序。str.strip():处理分号后可能存在的空格,保证属性值的整洁性(若无此场景可删除)。
内容的提问来源于stack exchange,提问作者user20320394
相关产品推荐
相关产品推荐

