熊猫,如何过滤df获取唯一条目?

时间:2014-01-28 10:06:22

标签: 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   D    22

如何使用pandas做到这一点?

4 个答案:

答案 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,:]