目标:我想搜索DF中名为“个人资料名称”的列,以及该名称的一部分是否包含特定市场。例如,如果“配置文件名称”(XX-France-AM)包含“ France”,我想将字符串“ France”添加到DF中名为“ Markets”的新列中。理想情况下,我想使用一个循环遍历5个不同的市场并应用相同的逻辑(即,如果“配置文件名称”包含意大利,则将意大利添加到“市场”。
我尝试了许多不同的版本来做到这一点,但这似乎是最接近的:
markets = ['France','Spain','UK','Germany','Italy']
for name in markets:
if df[df['Profile Name'].str.contains(name, na=False) == True]:
df['Market'] = name
它给我这个错误: ValueError:DataFrame的真实值不明确。使用a.empty,a.bool(),a.item(),a.any()或a.all()。
有人建议我如何做到最好吗?谢谢!
答案 0 :(得分:2)
您可以在一行中完成所有操作:
df['Market'] = df['Profile Name'].str.extract(f'({"|".join(markets)})')
更新:运行时比较(len(df) = 8000
)。
%%timeit -n 100
df['Market'] = df['Profile Name'].str.extract(f'({"|".join(markets)})')
# 8.46 ms ± 151 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)
%%timeit -n 100
for name in markets:
df.loc[df['Profile Name'].str.contains(name, na=False, regex=False), 'Market'] = name
# 16.7 ms ± 200 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)
答案 1 :(得分:0)
使用pandas的.loc []语法:
<ul>
<li>apple</li>
<li class="highlight">orange</li>
<li>pear</li>
<li>banana</li>
</ul>