我有一个这样的数据框:
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
如何使用pandas做到这一点?
答案 0 :(得分:3)
一种方法是对数据帧进行排序,然后在groupby之后取第一种方法。
# first way
sorted = df.sort(['type', 'value'], ascending = [True, False])
first = sorted.groupby('type').first().reset_index()
另一种方式不一定只采用第一种方式,因此可能会使所有ID保持对应于相同的最大值(并且不会只占用其中一种)
# second way
grouped = df.groupby('type').agg({'value': max}).reset_index()
grouped = grouped.set_index(['type','value'])
second = grouped.join(df.set_index(['type', 'value']))
示例:
数据
ID type value
1 A 8
2 A 5
3 B 11
4 C 12
5 D 1
6 D 22
7 D 13
8 D 22
第一种方法导致
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()
)
答案 1 :(得分:2)
使用groupby“type”并仅抓取第一个对象 - df.groupby( “类型”)。第一()
答案 2 :(得分:1)
df[['type', 'value']].drop_duplicates(subset=['type'])
这通常有效,如果您有更多列,则可以选择感兴趣的列,在本例中,我们选择了所有“类型”,“值”。
答案 3 :(得分:0)
我喜欢我的方式。因为groupby将创建新的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,:]