Python: добавить список в for-l oop неожиданный результат - PullRequest
1 голос
/ 21 марта 2020

Я пытаюсь создать новую переменную из списка («провайдера»), который проверяет наличие некоторых идентификаторов в другом столбце во фрейме данных:

import pandas as pd

xx = {'provider_id': [1, 2, 30, 8, 8, 7, 9]}
xx = pd.DataFrame(data=xx)

ids = [8,9,30]
names = ["netflix", "prime","sky"]

for id_,name in zip(ids,names):
    provider = []
    if id_ in xx["provider_id"]:
       provider.append(name)
provider

ожидаемый результат:

['netflix', 'prime', 'sky']

фактический результат:

['sky']

То есть for l oop продолжает перезаписывать результат name внутри l oop? Эта функциональность кажется мне странной, и я, честно говоря, не знаю, как помешать этому, кроме как написать три отдельных if заявления.

Заранее спасибо и всех в безопасности.

Ответы [ 3 ]

4 голосов
/ 21 марта 2020

Ваш l oop продолжает инициализировать список. Переместите список за пределы l oop:

provider = []
for id_,name in zip(ids,names):
    if id_ in xx["provider_id"]:
        provider.append(name)
print(provider)
1 голос
/ 21 марта 2020

Удалите все циклы и используйте встроенные методы pandas. Это будет работать намного быстрее.

df = pd.DataFrame({'ids': [8,9,30], 'names': ["netflix", "prime","sky"]})

cond = df.ids.isin(xx.provider_id)

df.loc[cond, 'names'].tolist()

['netflix', 'prime', 'sky']
1 голос
/ 21 марта 2020

Один из способов сделать это более эффективным - использовать sets и isin, чтобы найти совпадающие идентификаторы в кадре данных, а затем получить список с помощью zip, чтобы сохранить соответствующий names.

* 1006. * Ошибка , как указывает @quamrana, заключается в том, что вы продолжаете сбрасывать список внутри l oop.
s = set(xx.loc[xx.isin(ids).values, 'provider_id'].values)
# {8, 9, 30}
[name for id_, name in zip(ids, names) if id_ in s]
# ['netflix', 'prime', 'sky']
...