从 DataFrame 中删除重复的行,但将一列保留为列表 - Python
Remove duplicate rows from DataFrame but keeping one column as list- Python
我有这样一个数据框:
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 之外的所有值也相等。
因此,替换除添加到列表中的最后一个值之外的所有值。
我尝试使用此 link 中给出的解决方案:
我用过这个:
file = file.groupby('ID')
file = file['Last'].unique()
这是我得到的输出:
ID
35 [12, 14]
36 [15]
Name: Last, dtype: object
可能我在 groupby() 中遗漏了一些东西。
提前致谢:)
更新:
我原来的 Dataframe 有 100 多列。
如果两行的 ID 相等,则除 LAST 之外的所有值也相等。
这是你想要的吗?
df.groupby(['FIRST', 'ID']).LAST.apply(lambda x: x.tolist()).reset_index()
FIRST ID LAST
0 AB 36 [15]
1 ABC 35 [12, 14]
鉴于给定 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
我有这样一个数据框:
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 之外的所有值也相等。
因此,替换除添加到列表中的最后一个值之外的所有值。
我尝试使用此 link 中给出的解决方案:
我用过这个:
file = file.groupby('ID')
file = file['Last'].unique()
这是我得到的输出:
ID
35 [12, 14]
36 [15]
Name: Last, dtype: object
可能我在 groupby() 中遗漏了一些东西。
提前致谢:)
更新:
我原来的 Dataframe 有 100 多列。 如果两行的 ID 相等,则除 LAST 之外的所有值也相等。
这是你想要的吗?
df.groupby(['FIRST', 'ID']).LAST.apply(lambda x: x.tolist()).reset_index()
FIRST ID LAST
0 AB 36 [15]
1 ABC 35 [12, 14]
鉴于给定 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