从DataFrame中删除重复的行,但将一列保留为列表 - Python

时间:2017-08-15 22:44:02

标签: python pandas dataframe pandas-groupby

我有一个这样的数据框:

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()中遗漏了一些东西。

提前致谢:)

更新

我原来的Dataframe有超过100列。 如果两行的 ID 相等,则 LAST 以外的所有值也相等。

2 个答案:

答案 0 :(得分: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]

答案 1 :(得分: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