pandas根据另一列中考虑重复的值生成一个新列

时间:2017-10-26 07:38:01

标签: python-3.x pandas dataframe

我正在研究一个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

我想知道如何在熊猫中做到这一点。

1 个答案:

答案 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})