我无法找到完成此任务的方法。
我有一个有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
答案 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列表中有多个索引,则采用第一个索引。如果首选列表中没有索引,则采用第一个索引。我认为这符合你的逻辑。
感谢您提供示例数据,它使事情变得更加容易。