使用Pandas创建多DataFrame及处理含逗号单元格的CSV转换需求
我来帮你搞定这两个需求,先从CSV的数据拆分开始,再讲如何用Pandas创建包含多个DataFrame的结构:
1. 处理CSV文件,拆分多颜色行
你的需求是把包含多个颜色的行拆分成单独行,每个行只保留一个颜色,其他颜色位置填0。这里我们用Pandas来实现:
完整代码
import pandas as pd # 读取CSV文件,注意分隔符是分号 df = pd.read_csv('your_fruits.csv', sep=';') # 处理空的颜色列:把空值/空字符串转成空列表 df['Fruit_Color'] = df['Fruit_Color'].apply( lambda x: x.split(',') if pd.notna(x) and x.strip() else [] ) # 定义函数,把单一行扩展成对应颜色数量的多行 def expand_color_rows(row): colors = row['Fruit_Color'] expanded_rows = [] # 遍历每个颜色,生成对应行:当前颜色填值,其他两个颜色位填0 for idx, color in enumerate(colors): color_cols = ['0'] * 3 color_cols[idx] = color expanded_rows.append({ 'Fruit_Type': row['Fruit_Type'], 'Color1': color_cols[0], 'Color2': color_cols[1], 'Color3': color_cols[2], 'Fruit_Description': row['Fruit_Description'] }) # 如果没有颜色,生成一行全0的颜色列 if not colors: expanded_rows.append({ 'Fruit_Type': row['Fruit_Type'], 'Color1': '0', 'Color2': '0', 'Color3': '0', 'Fruit_Description': row['Fruit_Description'] }) return pd.DataFrame(expanded_rows) # 应用函数到每一行,合并所有结果 final_df = pd.concat(df.apply(expand_color_rows, axis=1).tolist(), ignore_index=True) # 保存处理后的CSV final_df.to_csv('expanded_fruits.csv', sep=';', index=False)
代码说明
- 读取CSV时指定分隔符为
;,避免和单元格内的逗号冲突 - 把
Fruit_Color列拆分成颜色列表,空值转为空列表 - 对每一行,根据颜色数量生成对应行数:每个颜色占据一个颜色列,其他列填
0;无颜色时生成全0行 - 最后合并所有行并保存为新的CSV
运行后你会得到和期望一致的结果,比如Apple会生成3行,Banana生成2行,Grape生成1行全0颜色的行。
2. 创建包含多个DataFrame的DataFrame
Pandas允许DataFrame的单元格存储任意对象,包括其他DataFrame。我们可以直接创建一个外层DataFrame,把子DataFrame作为单元格值存入:
完整代码
import pandas as pd # 先创建几个示例子DataFrame apple_df = pd.DataFrame({ 'Color': ['Green', 'Red', 'Yellow'], 'Stock': [100, 150, 80] }) banana_df = pd.DataFrame({ 'Color': ['Green', 'Yellow'], 'Stock': [50, 200] }) orange_df = pd.DataFrame({ 'Color': ['Red', 'Yellow'], 'Stock': [70, 120] }) # 创建外层DataFrame,包含子DataFrame container_df = pd.DataFrame({ 'Fruit_Type': ['Apple', 'Banana', 'Orange'], 'Fruit_Data': [apple_df, banana_df, orange_df] }) # 查看结果 print(container_df) # 访问某个子DataFrame,比如Apple的数据 print("\nApple的详细数据:") print(container_df.loc[container_df['Fruit_Type'] == 'Apple', 'Fruit_Data'].iloc[0])
代码说明
- 先定义需要嵌套的子DataFrame,每个子DataFrame可以对应不同的水果数据
- 外层DataFrame的
Fruit_Data列存储这些子DataFrame - 通过
loc结合iloc可以轻松取出某个单元格里的子DataFrame进行操作
这样你就得到了一个包含多个DataFrame的DataFrame结构,方便统一管理不同的数据集。
内容的提问来源于stack exchange,提问作者ECA
相关产品推荐
相关产品推荐

