将Pandas复杂字典类型写入DynamoDB遇类型错误,求嵌套Lambda方案
解决DynamoDB写入复杂类型时的numpy.ndarray不支持错误
报错核心原因是:pandas会自动把列表类型转为numpy.ndarray,而DynamoDB只支持原生Python数据类型(如list、dict、str等),因此需要将嵌套结构中的numpy数组转回普通Python列表。
针对当前场景的快速解决方案
直接在apply里遍历字典的键值对,将numpy数组转为列表:
import pandas as pd import numpy as np df = pd.DataFrame.from_records([{"col_w_status": {"ACTIVE":["ABC100-01"],"INACTIVE":["ABC100"]}}]) col_list = ["col_w_status"] for col in col_list: # 遍历字典内的每个值,将numpy数组转为Python列表 df[col] = df[col].apply(lambda x: {k: v.tolist() if isinstance(v, np.ndarray) else v for k, v in x.items()}) # 执行写入操作 # wr.dynamodb.put_df(df, <tableName>)
支持深层嵌套结构的通用解决方案
如果你的数据有多层嵌套(比如列表中包含字典,字典内又有数组),可以写一个递归函数统一转换:
import pandas as pd import numpy as np def convert_numpy_to_python(obj): if isinstance(obj, np.ndarray): return obj.tolist() elif isinstance(obj, dict): return {k: convert_numpy_to_python(v) for k, v in obj.items()} elif isinstance(obj, list): return [convert_numpy_to_python(item) for item in obj] else: return obj df = pd.DataFrame.from_records([{"col_w_status": {"ACTIVE":["ABC100-01"],"INACTIVE":["ABC100"]}}]) col_list = ["col_w_status"] for col in col_list: df[col] = df[col].apply(convert_numpy_to_python) # 执行写入操作 # wr.dynamodb.put_df(df, <tableName>)
内容的提问来源于stack exchange,提问作者NNM
相关产品推荐
相关产品推荐

