Как создать столбец в pandas dataframe, проходящий через dict или list? - PullRequest
0 голосов
/ 19 сентября 2019

Существует диктат

dict_example = {

'Request_1': {
    'request_id' : '1',
    'name' : 'Foo'
},

'Request_2': {
    'request_id' : '2',
    'name' : 'Bar'

},

'Request_3': {
    'request_id' : '3',
    'name' : 'Barbie'
}

И затем я делаю запросы API через итерацию этого диктанта, каждый запрос конвертируется в фрейм данных, а результат сохраняется в списке ответов.

API_request = get_me_api(
             for k,v in dict_example.items():
                 name=v['name'])

             responses.append(API_request)

responses = [df1, df2, df3]

df1

   age name city street
0   1   Foo  LA   street A

df2

   age name city street
0   10  Bar  NY   street B

df3

   age name   city street
0   20  Barbi  SF   street C

Я хочу добавить дополнительный столбец 'request_id' к каждому из фреймов данных.

Я пытался сделать через итерацию

for v in yt_params.values():
               dict_example ['request_id'] = v['request_id']

# and just a list 

request_ids = [1,2,3]

for response in responses:
   for request in request_ids:
       response['request_id'] = request

Но он создает столбец для каждого кадра данных всегда с последним идентификатором request_id

df1

   age name city street    request_id
0   1   Foo  LA   street A           3

df2

   age name city street   request_id
0   10  Bar  NY   street B          3

df3

   age name   city street    request_id
0   20  Barbi  SF   street C          3

Ответы [ 2 ]

1 голос
/ 19 сентября 2019

Вы ошиблись в своих циклах.request_id всегда будет заканчиваться последней записью в request_ids.Вот пример того, что происходит:

letters = ["a", "b", "c"]
numbers = [1, 2, 3]
end_product = {}

for letter in letters:
    for number in numbers:
        end_product[letter] = number
        print(end_product)

Вывод:

{'a': 1}
{'a': 2}
{'a': 3}                  #Last iteration sets "a" to 3
{'a': 3, 'b': 1}
{'a': 3, 'b': 2}
{'a': 3, 'b': 3}          # Last iteration sets "b" to 3
{'a': 3, 'b': 3, 'c': 1}
{'a': 3, 'b': 3, 'c': 2}
{'a': 3, 'b': 3, 'c': 3}  # Last iteration sets "c" to 3
1 голос
/ 19 сентября 2019

Вам, вероятно, нужно zip

Пример:

for response, id in zip(responses, request_ids):
    response['request_id'] = id
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...