当前位置: 代码迷 >> python >> Python:在for循环意外结果中附加列表
  详细解决方案

Python:在for循环意外结果中附加列表

热度:43   发布时间:2023-07-16 10:45:37.0

我正在尝试从列表('provider')中创建一个新变量,用于检查数据框中的另一列中是否存在某些 id:

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循环会不断覆盖循环内的name的结果吗? 这个功能对我来说似乎很奇怪,老实说,我不知道如何防止这种情况,然后编写三个单独的if语句。

您的循环不断初始化列表。 将列表移出循环:

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

提高效率的一种方法是使用setsisin在数据框中查找匹配的 id,然后使用zip进行列表zip以保留相应的names

@quamrana 指出的错误是您不断重置循环内的列表。

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

完全废弃循环并使用内置的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']