You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Pandas按日期分组拼接字符串后导出CSV格式异常问题

分组拼接字符串导出CSV格式异常修复

问题场景

初始DataFrame数据:

date                          str
2020-01-11 17:16:09+00:00     aa
2020-01-11 17:16:09+00:00     a  
2020-01-11 17:16:09+00:00     a    
2020-01-19 17:16:09+00:00     bb       
2020-01-19 17:16:09+00:00     bb   
2020-01-19 17:16:09+00:00     b   

尝试通过分组拼接字符串后导出为CSV:

df = df.groupby('date', as_index=False)['str'].apply(' '.join)
df = pd.DataFrame(df)

for index, row in df.iterrows():    
    date = str(row['date']).replace('-', '_')   
    filename = f'{date}.csv'
    with open(filename, 'w', encoding="utf-8-sig") as file:
        file.write(row['str'])

期望结果:每个CSV文件内是单行拼接文本(如2020-01-11.csv内容为aa a a)。

实际异常:文件内容按原元素换行显示:

2020-01-11.csv
aa 
a 
a

原因分析

  1. 分组拼接逻辑错误:groupby(..., as_index=False)['str'].apply(' '.join) 未正确将组内字符串拼接为单个字符串,反而返回了可迭代对象,导致写入时自动拆分换行。
  2. 原始字符串含隐藏格式:初始str列元素可能带有换行符(\n)或未清理的换行标记,即使拼接后仍会触发换行。

解决方法

1. 修正分组拼接代码

使用agg替代apply,确保组内字符串被正确拼接为单个字符串:

# 正确的分组拼接方式
df_grouped = df.groupby('date', as_index=False)['str'].agg(' '.join)

2. 清理原始字符串格式

提前去除str列中的换行符和多余空格:

# 清理字符串:去掉换行符,首尾去空格
df['str'] = df['str'].str.replace('\n', '').str.strip()
# 再执行分组拼接
df_grouped = df.groupby('date', as_index=False)['str'].agg(' '.join)

3. 优化文件写入逻辑

确保写入的是完整拼接字符串,同时可按需简化文件名中的日期格式:

for _, row in df_grouped.iterrows():
    # 提取日期部分(移除时分秒和时区)
    date_part = row['date'].split(' ')[0]
    filename = f'{date_part.replace("-", "_")}.csv'
    with open(filename, 'w', encoding="utf-8-sig") as f:
        f.write(row['str'])

完整可运行代码

import pandas as pd

# 构造初始数据
data = {
    'date': ['2020-01-11 17:16:09+00:00']*3 + ['2020-01-19 17:16:09+00:00']*3,
    'str': ['aa', 'a  ', 'a    ', 'bb       ', 'bb   ', 'b   ']
}
df = pd.DataFrame(data)

# 清理字符串格式
df['str'] = df['str'].str.strip()

# 分组拼接
df_grouped = df.groupby('date', as_index=False)['str'].agg(' '.join)

# 导出为单个CSV文件
for _, row in df_grouped.iterrows():
    date_part = row['date'].split(' ')[0]
    filename = f'{date_part.replace("-", "_")}.csv'
    with open(filename, 'w', encoding="utf-8-sig") as f:
        f.write(row['str'])

内容的提问来源于stack exchange,提问作者Diana Mele

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.05 01:50:21