首页 > 解决方案 > Python:遍历数据集以将值传递到字典的最佳方法是什么?

问题描述

我有一个通过 Google DFP API 将数据发送到我的广告服务器的函数。当我的变量(order_id、targeted_placement_id 等)具有硬编码的数据时,该函数起作用。

我的数据来自“ad_data.csv”,其中每一列是键,相关行中的数据是值。我想遍历这个数据集并将 csv 文件中每一行的值传递给line_itemdict 中的正确值。下面是我的熊猫DataFrame.head()

        order_id   targeted_placement_id          campaign
  0   3494982232              5555666677     Ad Campaign 1
  1   8494984434              1112666177     Ad Campaign 2
  3   4494922232              0992666677     Ad Campaign 3
  4   1494984234              9494939499     Ad Campaign 4

但是,在 for 循环中,我想传递每一行 'ad_data.csv'

from googleads import dfp
import pandas as pd

df = pd.read_csv('ad_data.csv')
order_id = df['order'].tolist()
targeted_placement_id = df['placement_id'].tolist()
campaign_name = df['campaign'].tolist() 

def main(client, order_id, targeted_placement_ids, campaign_name):
     line_item_service = client.GetService('LineItemService')

     # Create line item objects.
     line_items = []
     for _ in range(1):
         line_item = {
             'orderId': order_id,
             'name': campaign_name,
             'targeting': {
                 'inventoryTargeting': 
                    {'targetedPlacementIds': targeted_placement_ids},
             }
          }
          line_items.append(line_item)

     line_items = line_item_service.createLineItems(line_items)

     for line_item in line_items:
         print('Target id "%s", in order id "%s", named"%s" was created' 
               %(line_item['targetedPlacementId'], line_item['orderId'], line_item['name']))

if __name__ == '__main__':
    dfp_client = dfp.DfpClient.LoadFromStorage()
    main(dfp_client, order_id, targeted_placement_id, campaign_name)

如果正确完成,line_item应该打印:

Target id 5555666677 in order id 3494982232, named Ad Campaign 1 was created 
Target id 1112666177 in order id 8494984434, named Ad Campaign 2 was created 
Target id 0992666677 in order id 4494922232, named Ad Campaign 3 was created
Target id 9494939499 in order id 1494984234, named Ad Campaign 4 was created 

完成这项任务的最佳方法是什么?

标签: pythongoogle-dfp

解决方案


如果你想使用.csv.json文件,你应该使用 pandas 库。

要读取文件,您可以使用read_csv(),它将返回一个可以操作的 pandas DataFrame对象,然后如果要将其保存为 .csv 文件,只需使用to_csv()

要访问特定的行或列,您可以使用lociloc

您还可以使用tolist()将Series转换为 python 列表,例如

DF = pandas.DataFrame.read_csv('filename.csv')
orders = DF['Orders'].tolist()

orders 是一个 python 列表,其中包含 .csv 文件中名为 Orders 的列中的值

编辑: 正如评论中所讨论的,您应该找出最适合您的问题的工具。但是,如果您打算使用大型数据集,我建议您阅读文档中有关 pandas 内存使用的信息

有趣的文章:使用 pandas 减少大型数据集的内存使用

编辑2:

要将DataFrame的每一列作为列表,您应该执行以下操作:

orders = DF['order_id'].tolist()
targets = DF['targeted_placement_id'].tolist()
campaigns = DF['campaign'].tolist()
# print(orders, targets, campaigns)

您得到的ValueError是因为您试图将这些列表作为值传递给字典的keysorderId和. 遍历这些列表的一种方法是返回一个索引和每个位置的 order_id。nametargetedPlacementIdsenumerate(orders)

例如

0   3494982232
1   8494984434
2   4494922232

然后要获取每个订单的campaignstargets,您只需传递带有订单索引的列表,因此您的循环将是这样的:

# Create line item objects.
line_items = []
for index, order in enumerate(orders):
    line_item = {
        'orderId': order,
        'name': campaigns[index],
        'targeting': {
            'inventoryTargeting': {
                'targetedPlacementIds': targets[index]
            }
        }
    }
    line_items.append(line_item)
print(line_items)

最后,您line_items将是一个列表,其中每个位置都是字典。

PS:

您的打印循环有错误,而不是line_item['targetedPlacementId']应该是line_item['targeting']['inventoryTargeting']['targetedPlacementIds']

您还可以通过以下方式检查您的 DataFrame 是否具有空值:

if DF.isnull().values.any():
        raise Exception('Null values')

推荐阅读