首页 > 解决方案 > 连接熊猫数据框中的列表并在另一列中获取唯一标记

问题描述

我有一个由 4 列组成的数据框,第一列是 ID,其他列在每一行中都有列表作为它们的值。我需要连接所有这三列并获取唯一标记并创建另一列。这是一行,我有超过 100 万条记录。

original_df = pd.DataFrame({'ID':1, 
                   'Name_List1':[[ 'aa','bb']],
                   'Name_List2':[['Mutiso','Julia','Linger']],
                  'Name_List3':[['Mutiso','Julia','Linger','bb','cc']]})

所需的 df 是此脚本的输出

desired_df = pd.DataFrame({'ID':1, 
                   'Name_List1':[[ 'aa','bb']],
                   'Name_List2':[['Mutiso','Julia','Linger']],
                  'Name_List3':[['Mutiso','Julia','Linger','bb','cc']],
                  'Unique_name_list':[['aa','bb','cc','Mutiso','Julia','Linger']]})

如何获得第 5 列“Unique_name_list”列

标签: python-3.xpandas

解决方案


您可以尝试使用stack(), explode(注意这是 pandas 0.25+ 中的新功能)和groupby+agg, 然后map

m = original_df.set_index('ID').stack().explode()
       .drop_duplicates().groupby(level=0).agg(list)
original_df['Unique_name_list'] = original_df['ID'].map(m)
print(original_df)

   ID Name_List1               Name_List2                       Name_List3  \
0   1   [aa, bb]  [Mutiso, Julia, Linger]  [Mutiso, Julia, Linger, bb, cc]   

                      Unique_name_list  
0  [aa, bb, Mutiso, Julia, Linger, cc]  

或(较慢的版本)

您可以尝试apply使用np.concatenateand set

original_df = original_df.set_index('ID')
final = original_df.assign(Unique_name_list=original_df.apply(lambda x : 
                          [*set(np.concatenate(x))],axis=1)).reset_index()

   ID Name_List1               Name_List2                       Name_List3  \
0   1   [aa, bb]  [Mutiso, Julia, Linger]  [Mutiso, Julia, Linger, bb, cc]   

                      Unique_name_list  
0  [bb, Mutiso, cc, aa, Julia, Linger]  

推荐阅读