我有一个包含许多重复行的数据框。该数据集有数百行和列。
每一行都有一个唯一的标识符。我想创建一个仅包含唯一行的数据框。然后我想创建一个映射,将唯一行数据帧中的标识符映射到原始数据帧的标识符。
例如
import pandas as pd
# Dummy data
df = pd.DataFrame({'col_1': [1, 2, 2, 1, 2, 3],
'col_2': [2, 4, 4, 2, 4, 2],
'col_3': [3, 2, 2, 3, 2, 7]},
index=['A', 'B', 'C', 'D', 'E', 'F'])
df
Out[11]:
col_1 col_2 col_3
A 1 2 3
B 2 4 2
C 2 4 2
D 1 2 3
E 2 4 2
F 3 2 7
# Unique row dataframe
df_unique = df.drop_duplicates()
df_unique()
Out[12]:
col_1 col_2 col_3
A 1 2 3
B 2 4 2
F 3 2 7
# Mapping from df_unique to df
# Creating this mapping is the problem
mapping = {'A': ('A', 'D'),
'B': ('B', 'C', 'E'),
'F': ('F')}
在本例中,行“A”和“D”相等,并且“A”在 drop_duplicates()
之前映射到“A”和“D”。
如何创建映射
?
这里我使用 drop_duplicates()
创建唯一行数据帧。这不是一个要求。如果有人有更好的想法,映射不一定是字典。
最佳答案
使用GroupBy.agg
使用 DataFrame 的所有列的 first
和 tuple
,然后创建元组字典:
mapping = (df.reset_index()
.groupby(df.columns.tolist())['index']
.agg(['first',tuple])
.set_index('first')['tuple']
.to_dict())
print (mapping)
{'A': ('A', 'D'), 'B': ('B', 'C', 'E'), 'F': ('F',)}
关于python - 删除重复项但保留对删除行的引用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58820726/