我正试图从一个列表("提供者"(中创建一个新变量,该列表检查数据帧中的另一列中是否存在某些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)
完全废弃循环,并使用内置的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']
提高效率的一种方法是使用sets
和isin
在数据帧中找到匹配的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']