使用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
相关产品推荐
相关产品推荐

