簡體   English   中英

Python:迭代數據集以將值傳遞到dict的最佳方法是什么?

[英]Python: what is the best way to iterate through a dataset to pass the values into a dict?

我有一個通過Google DFP API將數據發送到廣告服務器的功能。 當我的變量(order_id,targeted_placement_id等)具有硬編碼的數據時,該函數起作用。

我的數據來自“ ad_data.csv” ,其中每一列都是鍵,關聯行中的數據是值。 我想遍歷此數據集,並將csv文件中每一行的值傳遞到line_item dict中的正確值中。 下面是我的熊貓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 

完成這項任務的最佳方法是什么?

如果要使用.csv.json文件,則應使用pandas lib。

要讀取文件,您可以使用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的列中的值

編輯:如評論中所述,您應該確定哪種工具最適合您的問題。 但是,如果您打算使用大型數據集,建議您在文檔中閱讀有關熊貓內存使用情況的信息。

有趣的文章: 使用大數據集的熊貓減少內存使用

編輯2:

要將DataFrame的每一列作為列表,您應該執行以下操作:

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

您得到的ValueError是因為您試圖將這些列表作為值傳遞給字典的鍵orderIdnametargetedPlacementIds 遍歷這些列表的一種方法是使用enumerate(orders) ,它將返回每個位置的索引和order_id。

例如

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')

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM