Python 如何使用数据帧中的值(使用ID作为公共值)更新DynamoDB列

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

我在dynamoDB中有一个名为returns portal的表,还有一个DataFrame,它有两列order\u name和return\u status

我需要更新dynamoDB表,使用order_名称作为两个数据集的ID,返回带有我的DF(df2)中的值的_status列,并且order_名称可以在dynamoDB表中出现多次,但在df2中只出现一次。我的问题是我真的不明白这怎么可能。我自己也尝试过将一些东西组合起来,但它不起作用,请参见下面的代码:

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。