【问题标题】:Join 2 columns with list values in pandas(Avoiding duplicates and NaN)将 2 列与 pandas 中的列表值连接起来(避免重复和 NaN)
【发布时间】:2022-01-07 07:00:30
【问题描述】:

我有如下熊猫数据框,

loc_1                               loc_2                             

[mumbai, gujarat, sri lanka]        [chennai, UP]
[Goa, telangana]                    [Kashmir, Goa, Rajkot]
NaN                                 [Bihar, Orissa]

我想创建一个由上述两列组合而成的新列, 我确实搜索了其他类似的问题,但我面临的问题是,

当我这样做时,

data['locations'] = data['loc_1'] + data['loc_2']

Output
--------
loc_1                               loc_2                       locations

[mumbai, gujarat, sri lanka]        [chennai, UP]                [mumbai, gujarat, sri lanka,chennai, UP]   
[Goa, telangana]                    [Kashmir, Goa, Rajkot]       [Goa, telangana,Kashmir, Goa, Rajkot]
NaN                                 [Bihar, Orissa]              NaN

问题

正如您在上面看到的,存在重复值以及形成的 NaN 值。 如何避免它们?

记住

原始数据集包含 list、str 和 NaN 格式的值。

数据集:


loc = pd.DataFrame({
'loc_1': [['mumbai', 'gujarat', 'sri lanka'],['Goa', 'telangana'],np.nan],
'loc_2':[['chennai','UP'],['kashmir','goa','rajkot'],['bihar','orissa']],
'loc_3':['Chennai','Bangalore','Vizag']

})

【问题讨论】:

    标签: python pandas list dataframe


    【解决方案1】:

    首先将值与替换 NaNs(浮点数)连接到空列表:

    data['locations'] = data['loc_1'].apply(lambda x: [] if isinstance(x, float) else x) + data['loc_2']
    

    然后通过dict.fromkeys 转换为字典来删除与原始顺序相同的重复项:

    data['locations'] = data['locations'].apply(lambda x: list(dict.fromkeys(x)))
    

    如果顺序不重要,你可以使用一个集合:

    data['locations'] = data['locations'].apply(lambda x: list(set(x)))
    

    【讨论】:

    • 这段无法解释的代码无法解决重复问题。
    • @wwnde - 为什么不申请?
    • @wwnde - apply for Series 真的很快,所以我决定使用它。
    【解决方案2】:

    如果您使用loc.fillna("", inplace=True),则包含空值的加法不应再导致 NaN。

    要从包含列表的列中过滤重复项,请使用:

    loc['locations'] = loc['locations'].apply(lambda locs: list(set(locs)))
    

    【讨论】:

      【解决方案3】:

      列表理解可以很快。让我们试试

         data['location']=[list(set([] if isinstance(x, float) else x).union(set(y))) for x,y in zip (data['loc_1'],data['loc_2'])]
      
       
      
            loc_1                     loc_2      loc_3  \
      0  [mumbai, gujarat, sri lanka]  [chennai, UP, sri lanka]    Chennai   
      1              [Goa, telangana]    [kashmir, goa, rajkot]  Bangalore   
      2                           NaN           [bihar, orissa]      Vizag   
      
                                          location  
      0  [chennai, UP, gujarat, mumbai, sri lanka]  
      1     [telangana, rajkot, goa, kashmir, Goa]  
      2                            [bihar, orissa]  
      

      【讨论】:

        【解决方案4】:

        第 1 步:将所有 Nans 替换为空列表,以便处理 NAN

            #Function to remove Nans
            def isnan(x):
               if isinstance(x, (int,  float, complex)) and math.isnan(x):
                  return True
        
            # Apply to your data
            loc1 = loc.apply(lambda x:x.apply(lambda x:[] if isnan(x) else x))
        
        1. 第 2 步:连接取集合后,删除重复项

           loc1['location'] = (loc1['loc_1']  + loc1['loc_2']).apply(set)
          

        如果您不想设置最终结果,请转换为列表

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2014-06-16
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多