我正在研究一个dataframe
,它有一个列,每个值都是一个列表,现在我想得到一个新列,它只考虑大小大于1的列表,为相应的值分配一个唯一的整数行作为id。如果两个列表中的元素相同但顺序不同,则应为这两个列表分配相同的ID。示例dataframe
就像,
document_no_list cluster_id
[1,2,3] 1
[3,2,1] 1
[4,5,6,7] 2
[8] 0
[9,10] 3
[10,9] 3
列cluster_id
仅考虑第1行,第2行,第3行,第5行和第6行,每行的大小都大于1,并为列中相应的单元格分配唯一的整数id,[1,2,3]
1}},[3,2,1]
和[9,10]
,[10,9]
应分配相同的cluster_id
。
我在不考虑重复列表值的情况下问了一个类似的问题,
pandas how to derived values for a new column base on another column
我想知道如何在熊猫中做到这一点。
答案 0 :(得分:1)
首先,您需要指定一个列有列表长度的列,另一列列出作为设置对象已排序:
df['list_len'] = df.document_no_list.apply(len)
df['list_sorted'] = df.document_no_list.apply(sorted)
然后你需要为每个 set 排序列表分配cluster_id
:
ids = df.loc[df.list_len > 1, ['list_sorted']].drop_duplicates()
ids['cluster_id'] = range(1,len(ids)+1)
将其连接到原始数据框上,并用零填充未加入的任何内容(单例):
df.merge(ids, how = 'left').fillna({'cluster_id':0})