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

Gio*_*elm 8 python numpy dataframe pandas

我有一个这样的数据框:

ID  type value
1   A    8
2   A    5
3   B    11
4   C    12
5   D    1
6   D    22
7   D    13
Run Code Online (Sandbox Code Playgroud)

我想过滤数据框,以便我有一个唯一出现的“类型”属性(例如 A 只出现一次),如果有更多的行具有相同的“类型”值,我想选择具有更高值的行. 我想得到类似的东西:

ID  type value
1   A    8
3   B    11
4   C    12
6   D    22
Run Code Online (Sandbox Code Playgroud)

我如何用熊猫做到这一点?

mkl*_*kln 7

一种方法是对数据框进行排序,然后在 groupby 之后取第一个。

# first way
sorted = df.sort_values(['type', 'value'], ascending = [True, False])

first = sorted.groupby('type').first().reset_index()
Run Code Online (Sandbox Code Playgroud)

另一种方式不一定只取第一个,因此可能会使所有 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']))
Run Code Online (Sandbox Code Playgroud)

例子:

数据

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
Run Code Online (Sandbox Code Playgroud)

第一种方法导致

type  ID  value
A   1      8
B   3     11
C   4     12
D   6     22
Run Code Online (Sandbox Code Playgroud)

第二种方法保持 ID=8

            ID
type value    
A    8       1
B    11      3
C    12      4
D    22      6
     22      8
Run Code Online (Sandbox Code Playgroud)

reset_index()如果你不喜欢多索引,你可以再次在这里)


ves*_*abo 5

df[['type', 'value']].drop_duplicates(subset=['type'])
Run Code Online (Sandbox Code Playgroud)

这通常有效,如果你有更多的列,你可以选择感兴趣的列,在我们的例子中我们选择了所有,“类型”,“值”。