Python 熊猫,如何过滤df以获得唯一的条目?
我有这样一个数据帧:Python 熊猫,如何过滤df以获得唯一的条目?,python,numpy,pandas,dataframe,Python,Numpy,Pandas,Dataframe,我有这样一个数据帧: ID type value 1 A 8 2 A 5 3 B 11 4 C 12 5 D 1 6 D 22 7 D 13 我想过滤数据帧,这样我就有了唯一的“type”attrybute(例如,a只出现一次),如果有更多的行具有相同的“type”值,我想选择一个值更高的行。 我想得到这样的东西: ID type value 1 A 8 3 B 11 4 C 12 6
ID type value
1 A 8
2 A 5
3 B 11
4 C 12
5 D 1
6 D 22
7 D 13
我想过滤数据帧,这样我就有了唯一的“type”attrybute(例如,a只出现一次),如果有更多的行具有相同的“type”值,我想选择一个值更高的行。
我想得到这样的东西:
ID type value
1 A 8
3 B 11
4 C 12
6 D 22
如何处理熊猫?使用groupby“type”并仅抓取第一个对象-
df.groupby(“type”).first()
# first way
sorted = df.sort_values(['type', 'value'], ascending = [True, False])
first = sorted.groupby('type').first().reset_index()
另一种方法不一定只采用第一种方法,因此可能会使所有ID对应于相同的最大值(而不是仅采用其中的一个)
例如:
资料
第一种方法导致
type ID value
A 1 8
B 3 11
C 4 12
D 6 22
第二种方法保持ID=8
ID
type value
A 8 1
B 11 3
C 12 4
D 22 6
22 8
(如果您不喜欢多重索引,您可以在此处再次reset_index()
)
这通常是有效的,如果您想要有更多的列,您可以选择感兴趣的列,在我们的例子中,我们选择了all,‘type’、‘value’ 我喜欢我的方式。因为groupby将创建新的df。您将获得唯一的值。但从技术上讲,这不会过滤你的df,这将创建一个新的df。我的方法将保持你的索引不变,你将得到相同的df,但没有重复
df = df.sort_values('value', ascending=False)
# this will return unique by column 'type' rows indexes
idx = df['type'].drop_duplicates().index
#this will return filtered df
df.loc[idx,:]
美好的这样我就失去了ID。我怎样才能恢复以前的布局?回答得很好。还有一个问题。实际上,我的idex是id,它们是唯一的标识符字符串,如“M_001”,我如何恢复这些索引?将其另存为一个额外的列,然后将其指定为索引?从上面开始,我会做
第二步。reset_index()。set_index('ID')
,如果你能提供一些口头信息,你的答案将更加丰富。除了@scriptmonster所说的,当用公认的答案回答旧问题时,解释为什么你的方法比这个答案更受欢迎是非常有用的。谢谢你的建议。
ID
type value
A 8 1
B 11 3
C 12 4
D 22 6
22 8
df[['type', 'value']].drop_duplicates(subset=['type'])
df = df.sort_values('value', ascending=False)
# this will return unique by column 'type' rows indexes
idx = df['type'].drop_duplicates().index
#this will return filtered df
df.loc[idx,:]