我有一个大型数据集,我使用id号作为索引。在我开始处理之前,我需要处理一些显示的重复ID,但需要根据多个条件来完成 - 基本上我希望所有重复条目中的最佳条目每个id。
在这个例子中,我可能首先希望它使用最近一年的副本 - 这将使id 1唯一。但是id 3仍然有两个值,所以我希望它进入下一个条件 - 在这种情况下我们会说最大值:
import pandas as pd
data = {'id':[1, 1, 2, 3, 3, 3], 'year':[2001, 2002, 2002, 2001, 2002, 2002], 'val':[7, 8, 9, 17, 11, 12]}
df = pd.DataFrame(data).set_index('id')
dups = df[df.index.duplicated(keep=False)]
for id in dups.index.unique():
current = dups.loc[id]
max_yr = current['year'].max()
#continue to process using multiple conditionals inside the loop
结果如下:
val year
id
1 7 2001
1 8 2002
2 9 2002
3 17 2001
3 11 2002
3 12 2002
转向:
val year
id
1 8 2002
2 9 2002
3 12 2002
它有效,但效率非常低,我觉得必须有一个矢量化或至少更好的方法来实现这一目标。可以合并一个groupby,但我还是不确定如果不循环遍历这些组,我将如何做到这一点。
答案 0 :(得分:1)
我们的想法是添加一个化合物列,它只能确定最佳匹配。例如,如果第一个标准是max(year)
,第二个标准是max(val)
,则可以将它们合并为tuple
并获取该列的最大值。如果某个条件为min(X)
,则可以将-X
添加到元组。 (tuples are compared element by element)
import pandas as pd
data = {'id':[1, 1, 2, 3, 3, 3], 'year':[2001, 2002, 2002, 2001, 2002, 2002], 'val':[7, 8, 9, 17, 11, 12]}
df = pd.DataFrame(data).set_index('id')
df['year_val'] = df.apply(lambda row: (row.year, row.val), axis=1)
df.reset_index().groupby('id').apply(
lambda df: df[df['year_val'] == df['year_val'].max()]).drop(
['year_val'], axis=1).set_index('id')
val year
id
1 8 2002
2 9 2002
3 12 2002