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

使用Boto3读取DynamoDB后,Pandas导出CSV丢失列问题求助

问题分析与解决:DynamoDB数据处理后CSV列数丢失

问题根源

你的代码执行df.groupby(df.index).agg(['min', 'max', 'mean'])时,Pandas仅会对数值类型列执行min/max/mean聚合操作,非数值类型列(比如字符串、布尔值)会被直接丢弃。原始85列里的19列属于非数值类型,因此聚合后这些列消失,最终导出的CSV只剩66列(数值列数×3 + 1个time列)。

解决思路

要保留所有列,需针对不同类型的列指定对应聚合逻辑:

  • 数值列:继续使用min/max/mean
  • 非数值列:根据业务需求选择聚合方式,比如取每组第一个值、最后一个值,或拼接所有值

修正后的代码

import boto3
import pandas as pd

# Export Raw data
dynamo_client = boto3.resource(...)
vopak_table = dynamo_client.Table('vopakdata2')
print(vopak_table.table_status)

# Get all items from Dynamodb
response = vopak_table.scan()
data = response['Items']
while 'LastEvaluatedKey' in response:
    response = vopak_table.scan(ExclusiveStartKey=response['LastEvaluatedKey'])
    data.extend(response['Items'])

# Write raw data to CSV
df = pd.DataFrame(data)
first_column = df.pop('time')
df.insert(0, 'time', first_column)
df.to_csv(r'C:\export.csv', index=False, header=True)

# MMA Calculation
df['time'] = df['time'].astype("datetime64").dt.date
df = df.set_index("time")

# 拆分数值列和非数值列
numeric_cols = df.select_dtypes(include=['number']).columns
non_numeric_cols = df.select_dtypes(exclude=['number']).columns

# 分别聚合:数值列做min/max/mean,非数值列取每组第一个值
agg_result = df[numeric_cols].groupby(df.index).agg(['min', 'max', 'mean'])
non_numeric_result = df[non_numeric_cols].groupby(df.index).first()

# 合并结果
df_combined = pd.concat([agg_result, non_numeric_result], axis=1)

# 重置索引并导出
df_combined = df_combined.reset_index()
print(df_combined)
df_combined.to_csv(r'C:\exportMMA.csv', index=False, header=True)

补充说明

  • 如果非数值列需要其他聚合逻辑,可把first()换成你需要的方法,比如last()、agg(lambda x: ','.join(x))(字符串拼接)等。
  • 可先打印numeric_cols和non_numeric_cols,确认哪些列是数值/非数值类型,验证是否对应丢失的19列。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.09 00:50:43