【问题标题】:Pandas: Looping through a list of strings in a column & create a new column with stringPandas:循环遍历列中的字符串列表并使用字符串创建新列
【发布时间】:2019-12-10 15:27:44
【问题描述】:

目标:我想在我的 DF 中搜索一个名为“个人资料名称”的列,以及名称的一部分是否包含某个市场。例如,如果“Profile Name”(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()。

有人对我如何才能做到最好有建议吗?谢谢!

【问题讨论】:

    标签: string pandas for-loop


    【解决方案1】:

    您可以在一行中完成所有操作:

    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)
    

    【讨论】:

    • 正则表达式与纯子字符串搜索可能会更慢。检查这是否受到惩罚会很有趣。
    • 对于玩具数据,正则表达式比 contains 循环更快。可能是因为您不需要多次扫描所有字符串。
    • 似乎合法。我想,至少部分地,我们利用了这样一个事实,即我们不关心我们找到了什么子字符串(或者我们确定我们只能有一个子字符串)。
    【解决方案2】:

    使用 pandas 的 .loc[] 语法:

    markets = ['France','Spain','UK','Germany','Italy']
    for name in markets:
        df.loc[df['Profile Name'].str.contains(name, na=False, regex=False), 'Market'] = name
    

    【讨论】:

      猜你喜欢
      • 2014-09-19
      • 2023-01-24
      • 2021-04-02
      • 1970-01-01
      • 2020-06-19
      • 2021-02-21
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多