删除重复索引,优先级由列中的值指定

时间:2014-11-07 12:45:23

标签: python pandas

我无法找到完成此任务的方法。
我有一个有n行的DataFrame 某些索引 id 重复(重复两次或更多次) 这是一个简化的例子:

>>> import pandas as p
>>> df = p.DataFrame({'id':['a','a','b', 'b'], 'test':['e','y','g', 's'], 'data':['re','rf','rg', 'rn']})
>>> df.set_index('id')
    test  data
id           
a     e    re
a     y    rf
b     g    rg
b     s    rn

我需要删除重复的索引以保留一行。不要介意它是第一个,最后一个还是中间的,除非测试列中的值包含在首选值列表中。

preferred_values = ['x', 'y', 'z']

如果是这种情况,并考虑到我的示例,则必须保留首选值 y 的行。
因此,可能的结果将是:

   test  data
id           
a     y    rf
b     s    rn

我考虑过groupby,但考虑到首选值的条件,我无法进行汇总。
我还尝试使用groupby过程中创建的数据帧,例如:

gb = df.groupby('id')
for name, group in gb:
    if len(group) > 1:
        print name
        print group
        # modify group here

1 个答案:

答案 0 :(得分:1)

我喜欢你的groupby方法。可能有更容易或更多的Pandas-esqe方式,但这个野蛮似乎完成它:

df2 = p.DataFrame()

for name, group in gb:
    if len(group) > 1:
        group['keeper'] =  group.test.isin(preferred_values)
        newindex = group[ group.keeper==True ].head(1).copy()
        if len(newindex) < 1:
            newindex = group.head(1).copy()
        df2 = df2.append(newindex[['data','id','test']])

那里有一些隐含的规则。如果preferred_values列表中有多个索引,则采用第一个索引。如果首选列表中没有索引,则采用第一个索引。我认为这符合你的逻辑。

感谢您提供示例数据,它使事情变得更加容易。