代码之家  ›  专栏  ›  技术社区  ›  Jivan

检查一个单元格的值是否在另一个单元格的列表/集合中

  •  0
  • Jivan  · 技术社区  · 6 年前

    如果我有以下数据帧:

          country       countries
    1      France       {France, Sweden, England}
    2     Germany       {France, Sweden, England}
    3     Germany       {Portugal, Greece, Germany}
    4      Sweden       {Spain, England}
    5       Spain       {England, Greece}
    6       Spain       {Portugal, Spain, Italy}
    

    有没有一种快速(矢量化)的方法来检查 country 在一组 countries ?

          country       countries                         is_in
    1      France       {France, Sweden, England}         True
    2     Germany       {France, Sweden, England}         False
    3     Germany       {Portugal, Greece, Germany}       True
    4      Sweden       {Spain, England}                  False
    5       Spain       {England, Greece}                 False
    6       Spain       {Portugal, Spain, Italy}          True
    

    df.apply() 是非常容易,但也非常缓慢。因此,我正在寻找一个使用Numpy或本地熊猫矢量化方法的解决方案。

    我想到了努比的 np.isin() np.in1d() 但它们不适合,因为它们假定要比较的是一组唯一的常量值,而不是每行一组值。

    3 回复  |  直到 6 年前
        1
  •  1
  •   rafaelc    6 年前

    可以使用集合交集

    df.country.transform(lambda s: {s}) & df.countries.values
    

    检查计时

    df = pd.concat([df]*1000)
    
    %timeit df.country.transform(lambda s: {s}) & df.countries.values
    4.53 ms ± 512 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)
    
    %timeit df.apply(lambda x: x['country'] in x['countries'], 1)
    156 ms ± 6.25 ms per loop (mean ± std. dev. of 7 runs, 10 loops each)
    
    %timeit [x in y for x , y in zip(df.country,df.countries)]
    598 µs ± 97.8 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)
    
        2
  •  2
  •   BENY    6 年前

    IIUC公司

    [x in y for x , y in zip(df.country,df.countries)]
    
        3
  •  0
  •   Ananay Mital    6 年前

    df["is_in"] = [row["country"] in row["countries"] for idx, row in df.iterrows()]

    我不知道这是否能满足你的时间限制,但希望能有所帮助。