【问题标题】:Remove duplicate rows from DataFrame but keeping one column as list- Python从 DataFrame 中删除重复的行,但将一列保留为列表 - Python
【发布时间】:2017-08-17 05:23:48
【问题描述】:

我有一个这样的数据框:

file:
      | FIRST | LAST | ID |
---------------------------
0      "ABC"     12    35 
1      "ABC"     14    35
2      "AB"      15    36

现在,我想要的是:

file:
      | FIRST | LAST  | ID |
---------------------------
0      "ABC"   [12,14]  35 
2      "AB"      15     36

对于这个问题,我们假设如果两行的 ID 相等,那么除了 LAST 之外的所有值也相等。

因此,替换除了last的值之外的所有值,这些值被添加到列表中。

我尝试使用此链接中给出的解决方案: Pandas DataFrame - Combining one column's values with same index into list

我用过这个:

file = file.groupby('ID')

file = file['Last'].unique()

这是我得到的输出:

ID
35    [12, 14]
36        [15]
Name: Last, dtype: object

可能,我在 groupby() 中遗漏了一些东西。

提前致谢:)

更新:

我的原始数据框有 100 多列。 如果两行的 ID 相等,则除 LAST 之外的所有值也相等。

【问题讨论】:

    标签: python pandas dataframe pandas-groupby


    【解决方案1】:

    鉴于给定 ID 只有最后两行不同,因此在对它们应用 groupby 时只需取第一个值。对于 `LAST' 列,使用它的值或将其转换为唯一项目的列表(如果有多个)。

    grouping_cols = ['ID', ...]
    agg_cols = {col: 'first' for col in df if col not in grouping_cols}
    agg_cols['LAST'] = lambda x: x.unique().tolist() if len(x) > 1 else x.iat[0]
    >>> df.groupby(grouping_cols, as_index=False).agg(agg_cols)
      ID      LAST FIRST
    0  35  [12, 14]   ABC
    1  36        15    AB
    

    【讨论】:

    • 如果我想使用多列进行 groupby() 怎么办?
    • 这是我得到的:ValueError: function does not reduce
    【解决方案2】:

    这是你想要的吗?

    df.groupby(['FIRST', 'ID']).LAST.apply(lambda x: x.tolist()).reset_index()
    
        FIRST   ID  LAST
    0   AB      36  [15]
    1   ABC     35  [12, 14]
    

    【讨论】:

    • 我的数据框有 100 多列,所以当我将 ['First','ID'] 放入 groupby 时,所有其他列都不会存在。
    • 在这种情况下,即使是其他列也需要聚合,您是否也希望它们在列表中?
    • 正如我在问题中提到的,如果两行的 ID 值相等,那么所有其他列的值也相等,除了 LAST。
    猜你喜欢
    • 2021-05-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-09-29
    • 2016-10-13
    • 1970-01-01
    • 2021-07-26
    • 1970-01-01
    相关资源
    最近更新 更多