【问题标题】:Python: append list in for-loop unexpected resultPython:在for循环意外结果中追加列表
【发布时间】:2020-07-02 12:44:22
【问题描述】:

我正在尝试从一个列表('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 语句。

【问题讨论】:

    标签: python pandas loops for-loop


    【解决方案1】:

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

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

    【讨论】:

      【解决方案2】:

      提高效率的一种方法是使用setsisin 在数据框中查找匹配的ID,然后使用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']
      

      【讨论】:

        【解决方案3】:

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

        【讨论】:

          最近更新 更多