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

将for循环中的每个值附加到数据帧中的列单元格中

  •  1
  • Sudhi  · 技术社区  · 6 年前

    我已经根据一个条件将一个数据帧拆分为两个。我将两个数据帧中的“ItemName”列转换为一个列表。

    我尝试使用difflib在两个列之间执行近似的字符串匹配,每个数据帧中都有一个,都称为“ItemName”。我想将名为'matchlist'的列表作为一列加入到源数据帧中,或者另一方面,如果我可以将for循环的每个输出附加到源数据帧中的一个新列中,就可以了。

    source = list(datadf['ItemName'])
    destination = list(datadf['ItemName'])
    
    matchlist = []
    for i in source:
        x = difflib.get_close_matches(i, destination, 3, 0.6)
        matchlist.append(x)
    

    我在pandas中尝试了join和merge选项,但是没有任何错误,新添加的列只显示NaN值。两个名为“ItemName”的列都只包含字符串值。

    有人能帮我想个办法吗?

    1 回复  |  直到 6 年前
        1
  •  0
  •   jezrael    6 年前

    我想我需要把名单还给你:

    datadf['new'] = matchlist
    

    或者使用列表理解代替循环解决方案:

    datadf = pd.DataFrame({
        'ItemName': ['as','asds','as','aa','ssb','ab','sb']
    })
    print (datadf)
      ItemName
    0       as
    1     asds
    2       as
    3       aa
    4      ssb
    5       ab
    6       sb
    
    #convert to list is not necessary
    L = datadf['ItemName']
    datadf['new'] = [difflib.get_close_matches(i, L, 3, 0.6) for i in L]
    print (datadf)
      ItemName             new
    0       as  [as, as, asds]
    1     asds  [asds, as, as]
    2       as  [as, as, asds]
    3       aa            [aa]
    4      ssb       [ssb, sb]
    5       ab            [ab]
    6       sb       [sb, ssb]
    

    编辑:

    如果需要在不同数据帧的两列之间进行检查:

    datadf = pd.DataFrame({ 'Fruits':pd.Categorical(['apple','orange', 'apple', 'pineapple']), 
                          'Juices':pd.Categorical(['apple','orange smash','apple1','milkshake']), 
                          'Year': pd.Categorical([2011, 2011, 2012, 2012])}) 
    print (datadf)
          Fruits        Juices  Year
    0      apple         apple  2011
    1     orange  orange smash  2011
    2      apple        apple1  2012
    3  pineapple     milkshake  2012
    
    data_df_splitone = datadf[(datadf['Year'] == 2011)].copy()
    data_df_splittwo = datadf[(datadf['Year'] == 2012)].copy()
    
    L1 = data_df_splitone['Juices']
    L2 = data_df_splittwo['Juices']
    
    data_df_splitone['new'] = [difflib.get_close_matches(i, L2, 3, 0.6) for i in L1]
    print (data_df_splitone)
       Fruits        Juices  Year       new
    0   apple         apple  2011  [apple1]
    1  orange  orange smash  2011        []