Python- 'ValueError: неверный литерал для int () с основанием 10' при преобразовании списка со строками в целые числа - PullRequest
0 голосов
/ 04 июля 2018

Я использую функцию Pandas read_excel для создания data_frames для каждого столбца в моей книге. Данные используются с Google DFP API для создания позиций на нашем рекламном сервере.

Я перебираю и передаю данные из моих data_frames в dict как значения. Ниже мой код:

import pandas as pd
from googleads import dfp

workbook = 'dfp-migration-data.xlsx'
sheet = 'main'

df = pd.read_excel(workbook, sheet_name=sheet)

campaign_id = df['order_id'].tolist()
campaign = df['order'].tolist()
target = df['placement_id']

placement_id = []

def create_line_item(client, orders):
     line_item_service = client.GetService('LineItemService')

line_items = []
for index, order in enumerate(orders):

    line_item = {
        'name': line_item_name[index],
        'orderId': int(campaign_id[index]),
        'targeting': {
            'inventoryTargeting': {
                'targetedPlacementIds': placement_id[index]},
             },

    line_items.append(line_item)

# Add line items to DFP
line_items = line_item_service.createLineItems(line_items)

# Display results
for line_item in line_items:
    print(f"Order ID: {line_item['orderId']}"
          f"Line Item: {line_item['name']}"
          f"Placement IDs: {line_item['targeting']['inventoryTargeting']['targetedPlacementIds']}\n"

if __name__ == '__main__':
    dfp_client = dfp.DfpClient.LoadFromStorage()
    create_line_item(dfp_client, campaign)

Проблема, с которой я столкнулся, связана с фреймом данных target, который имеет несколько значений в каждой ячейке. например,

df['placement_id'].head()
0    28816768, 28809669, 28809672, 28809675, 288092...
1    28825664, 28825670, 28825511, 28825673, 288256...
2    28825538, 28816006, 28814215, 28825544, 288254...
Name: placement_id, dtype: object

При передаче placement_id в клавишу targetedPlacementIds я получаю сообщение об ошибке, что имеет смысл, поскольку данные из моего фрейма данных являются строкой. Однако, если я пытаюсь обернуть 'location_id' функцией int(), я получу 'ValueError: неверный литерал для int () с ошибкой base 10' . Я пытался использовать функции to_numbers () и astype (int ()) в Pandas, но получил ту же ошибку.

Как я могу преобразовать place_ids из строк в целые числа, чтобы я мог передать данные в мой line_item dict?

1 Ответ

0 голосов
/ 04 июля 2018

Если вы разрешите каждой строке иметь список значений int, ниже должно работать.

df['placement_id'] = df['placement_id'].apply(lambda x: x.split(", "))
df['placement_id'] = df['placement_id'].apply(lambda x: [int(y) for y in x])

И вы получите это:

In [3]: df['placement_id'].head()
Out[3]:
0    [28816768, 28809669, 28809672, 28809675, 288092]
1    [28825664, 28825670, 28825511, 28825673, 288256]
2    [28825538, 28816006, 28814215, 28825544, 288254]
Name: placement_id, dtype: object

In [4]: type(df['placement_id'][0][0])
Out[4]: int
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...