删除由列中的值赋予优先级的重复索引

2024-04-24 23:23:07 发布

您现在位置:Python中文网/ 问答频道 /正文

我找不到办法来完成这件事。
我有一个包含n行的数据帧。
一些索引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

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

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

Tags: 数据nametestreid示例dfdata
1条回答
网友
1楼 · 发布于 2024-04-24 23:23:07

我喜欢你的groupby方法。也许有一个更简单或更多的方法,但这个畜生似乎完成了:

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']])

里面有一些潜规则。如果“首选值”列表中有多个索引,则采用第一个索引。如果首选列表中没有索引,则使用第一个索引。我认为这符合你的逻辑。你知道吗

感谢您提供示例数据,它使事情变得更加简单。你知道吗

相关问题 更多 >