【问题标题】:How to group data and construct a new column - python pandas?如何对数据进行分组并构造一个新列 - python pandas?
【发布时间】:2021-10-18 00:49:33
【问题描述】:

我有一个如下所示的数据集:

postcode house_number  col2  col3
xxx      xxx           xxx   xxx
xxx      xxx           xxx   xxx

我想通过postcodehouse_number对数据进行分组,如果两行有相同的邮政编码和门牌号,则表示它们是相同的属性,那么我想为每个属性构造一个unique_id(在换句话说,对于unique_idpostcode / house_number 必须相同,但 col2 / col3 的值可能不同),例如:

unique_id postcode house_number  col2  col3
0         111      222           xxx   xxx 
0         111      222           xxx   xxx
1         xxx      xxx           xxx   xxx
.....

我尝试了new_df = ppd_df.groupby(['postcode','house_number']).reset_index(),但它给了我错误AttributeError: 'DataFrameGroupBy' object has no attribute 'reset_index',我也不知道如何构造列unique_id。有人可以帮忙吗?谢谢。

【问题讨论】:

    标签: python pandas dataframe group-by pandas-groupby


    【解决方案1】:

    使用groupby ngroup 将每个组编号从 0 到组数 - 1:

    df['unique_id'] = df.groupby(['postcode', 'house_number']).ngroup()
    

    df:

       postcode  house_number  col2  col3  unique_id
    0       111           222     1     5          0
    1       111           222     2     6          0
    2       111           444     3     7          1
    3       333           333     4     8          2
    

    如果需要,可以使用insert 使其成为第一列:

    df.insert(0, 'unique_id', df.groupby(['postcode', 'house_number']).ngroup())
    

    df:

       unique_id  postcode  house_number  col2  col3
    0          0       111           222     1     5
    1          0       111           222     2     6
    2          1       111           444     3     7
    3          2       333           333     4     8
    

    *注意:sort=False 可用于确保按组在 DataFrame 中出现的顺序枚举组:

    df['unique_id'] = df.groupby(['postcode', 'house_number'], sort=False).ngroup()
    

    或者

    df.insert(0, 'unique_id',
              df.groupby(['postcode', 'house_number'], sort=False).ngroup())
    

    否则,组将按照“在迭代 groupby 对象时看到组的顺序,而不是第一次观察它们的顺序”来枚举。


    DataFrame 和导入:

    import pandas as pd
    
    df = pd.DataFrame({
        'postcode': [111, 111, 111, 333],
        'house_number': [222, 222, 444, 333],
        'col2': [1, 2, 3, 4],
        'col3': [5, 6, 7, 8],
    })
    

    【讨论】:

    • 您好,我尝试了您的方法,但 unique_id 的值从 -1 而不是 0 开始
    • 这是不可能的。 ngroup 不能生成负数。
    • 我忘记了实际获取 grouper.group_info[0] 值的方便 ngroup,谢谢提醒 ;)
    • 啊,对了,我用来分组的列之一包含多个 NaN 值,我删除了该列,看起来现在可以使用了
    • 啊,很有趣。如果 postcode 或 house_number 都是 NaN 组确实会返回 -1。很奇怪。我不认为这是预期的行为......我认为因为NaN != NaN 它无法确定如何对其进行分组。
    【解决方案2】:

    postcodehouse_number 列创建元组并使用pd.factorize 获取唯一标识符:

    df['unique_id'] = \
        pd.factorize(df[['postcode', 'house_number']].apply(tuple, axis=1))[0]
    
    >>> df
       postcode  house_number col2 col3  unique_id
    0       111           222  xxx  xxx          0
    1       111           333  xxx  xxx          1
    2       111           222  xxx  xxx          0
    3       111           222  xxx  xxx          0
    4       222           444  xxx  xxx          2
    

    【讨论】:

    • 有趣的解决方案,但是比简单的 groupby 慢约 3 倍;)
    猜你喜欢
    • 2021-10-19
    • 2018-04-13
    • 1970-01-01
    • 2011-02-15
    • 1970-01-01
    • 2017-10-09
    • 2015-10-01
    • 2015-10-06
    • 2022-11-14
    相关资源
    最近更新 更多