Python 如何使用数据帧中的值(使用ID作为公共值)更新DynamoDB列
我在dynamoDB中有一个名为returns portal的表,还有一个DataFrame,它有两列order\u name和return\u status 我需要更新dynamoDB表,使用order_名称作为两个数据集的ID,返回带有我的DF(df2)中的值的_status列,并且order_名称可以在dynamoDB表中出现多次,但在df2中只出现一次。我的问题是我真的不明白这怎么可能。我自己也尝试过将一些东西组合起来,但它不起作用,请参见下面的代码:Python 如何使用数据帧中的值(使用ID作为公共值)更新DynamoDB列,python,pandas,amazon-dynamodb,boto3,Python,Pandas,Amazon Dynamodb,Boto3,我在dynamoDB中有一个名为returns portal的表,还有一个DataFrame,它有两列order\u name和return\u status 我需要更新dynamoDB表,使用order_名称作为两个数据集的ID,返回带有我的DF(df2)中的值的_status列,并且order_名称可以在dynamoDB表中出现多次,但在df2中只出现一次。我的问题是我真的不明白这怎么可能。我自己也尝试过将一些东西组合起来,但它不起作用,请参见下面的代码: import boto3 from
import boto3
from boto3.dynamodb.conditions import Key
import json
import pyodbc
import pandas as pd
import numpy as np
import datetime
from func.excelfunction import *
from datetime import datetime as dt
from datetime import timedelta
import requests
import csv
import os
import math
from sql_server.sql_server import *
#Connect to ETL DB
df1 = run_sql_df('SET NOCOUNT ON; select distinct order_number, return_status from etl_db.dbo.shopify_returns_portal')
df1 = df1.astype({"order_number":"str","return_status":"str"})
filename = 'test_file.csv'
df1.to_csv(str(filename),index=False)
df2 = pd.read_csv('test_file.csv')
df2 = df2.astype({"order_number":"str","return_status":"str"})
#create update statement for DynamoDB
def update_status(order_number,return_status, dynamodb=None):
if not dynamodb:
dynamodb = boto3.resource("dynamodb",aws_access_key_id ="XXXXXXXXXXXX",aws_secret_access_key = "XXXXXXXXXXXXXXXXXX",region_name = "eu-west-1")
table = dynamodb.Table('returns-portal')
response = table.update_item(
Key={
'order_number': df2.order_number
},
UpdateExpression="set return_status =:r",
ExpressionAttributeValues={
':r': df2.return_status
},
ReturnValues="UPDATED_NEW"
)
return response
if __name__ == '__main__':
update_response = update_status(df2.order_number,df2.return_status)
print("Update movie succeeded:")
pprint(update_response, sort_dicts=False)
我得到的错误是:
TypeError: Unsupported type "<class 'pandas.core.series.Series'>" for value "0 25061198
1 25061184
2 14441634
3 14441639
4 25061205
5 26054929503
6 25061203
7 25061186
8 14441629
9 25061187
10 25061201
11 25061196
12 14441636
13 25061177
14 25061194
15 14441641
16 25061189
17 25061206
18 25061204
19 14441628
20 25061199
21 25061185
22 14441633
23 25061197
24 25061180
25 14441638
26 25061192
27 25061195
28 14441637
29 25061193
30 25061200
31 14441635
Name: order_number, dtype: object"
TypeError:值“0 25061198”的类型“”不受支持
1 25061184
2 14441634
3 14441639
4 25061205
5 26054929503
6 25061203
7 25061186
8 14441629
9 25061187
10 25061201
11 25061196
12 14441636
13 25061177
14 25061194
15 14441641
16 25061189
17 25061206
18 25061204
19 14441628
20 25061199
21 25061185
22 14441633
23 25061197
24 25061180
25 14441638
26 25061192
27 25061195
28 14441637
29 25061193
30 25061200
31 14441635
名称:订单号,数据类型:对象“
我强烈怀疑我这样做是完全错误的,但我在网上找不到任何关于使用dataFrame更新DynamoDB表的人的信息。通过查看它,我觉得您可能需要在dynamoDB中迭代行,但我不知道是否是这种情况,或者如何做到这一点
非常感谢您提供的所有帮助。您没有重复查看订单号或退货状态列表,而是发送整个列(或系列) 不过,首先,不确定您为什么要将csv重新读取到df2,只需始终使用df1—它是相同的数据 要获得要迭代的列表,可以使用zip或To_dict,如前所述。下面是一个zip示例。它给出了一个元组列表
onum_status_pair_list = list(zip(df1['order_number'], df1['return_status']))
然后你想迭代这个。更新您的代码:
def update_status(order_number,return_status, dynamodb=None):
if not dynamodb:
dynamodb = boto3.resource("dynamodb",aws_access_key_id ="XXXXXXXXXXXX",aws_secret_access_key = "XXXXXXXXXXXXXXXXXX",region_name = "eu-west-1")
table = dynamodb.Table('returns-portal')
response = table.update_item(
Key={
'order_number': order_number
},
UpdateExpression="set return_status =:r",
ExpressionAttributeValues={
':r': return_status
},
ReturnValues="UPDATED_NEW"
)
return response
if __name__ == '__main__':
# note use of parenthesis to iterate list of tuples
for (onum, stat) in onum_status_pair_list:
update_response = update_status(onum,stat)
print("Update movie succeeded:")
pprint(update_response, sort_dicts=False)
如果你遇到问题,给我一张便条。没有办法测试这个…使用pandas中的to_dict方法将其转换为字典列表。然后遍历该列表,并对每个字典项调用update。