【问题标题】:pandas generates a new column based on values from another column considering duplicatespandas 根据另一列中的值生成一个新列,考虑重复项
【发布时间】:2017-10-26 23:42:14
【问题描述】:

我正在研究一个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][3,2,1][9,10][10,9] 应分配相同的 cluster_id

我在没有考虑重复列表值的情况下问了一个类似的问题,在

pandas how to derived values for a new column base on another column

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

【问题讨论】:

    标签: python-3.x pandas dataframe


    【解决方案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})
    

    【讨论】:

    • TypeError: unhashable type: 'set'
    • 抱歉,我实际上并没有尝试运行该代码。显然 pandas 在处理集合时遇到了麻烦,因此您可以改为对列表进行排序并进行比较。
    猜你喜欢
    • 2017-12-17
    • 2022-10-21
    • 1970-01-01
    • 1970-01-01
    • 2020-02-19
    • 2020-04-16
    • 1970-01-01
    • 2022-11-19
    • 2021-03-30
    相关资源
    最近更新 更多