Els*_*lex 41 python duplicates pandas
我有一个数据框,其中包含两列(A和B)的重复值:
A B C
1 2 1
1 2 4
2 7 1
3 4 0
3 4 8
Run Code Online (Sandbox Code Playgroud)
我想删除重复项,在C列中保留行的最大值.这将导致:
A B C
1 2 4
2 7 1
3 4 8
Run Code Online (Sandbox Code Playgroud)
我无法弄清楚如何做到这一点.我应该使用drop_duplicates()其他什么吗?
Joe*_*ron 61
您可以使用group by:
c_maxes = df.groupby(['A', 'B']).C.transform(max)
df = df.loc[df.C == c_maxes]
Run Code Online (Sandbox Code Playgroud)
c_maxes是每组Series中的最大值,C但它具有相同的长度和相同的索引df.如果您还没有使用.transform那么打印c_maxes可能是一个好主意,看看它是如何工作的.
使用的另一种方法drop_duplicates是
df.sort('C').drop_duplicates(subset=['A', 'B'], take_last=True)
Run Code Online (Sandbox Code Playgroud)
不确定哪个更有效,但我想第一种方法,因为它不涉及排序.
编辑:
从pandas 0.18第二个解决方案将是
df.sort_values('C').drop_duplicates(subset=['A', 'B'], keep='last')
Run Code Online (Sandbox Code Playgroud)
或者,或者,
df.sort_values('C', ascending=False).drop_duplicates(subset=['A', 'B'])
Run Code Online (Sandbox Code Playgroud)
在任何情况下,groupby解决方案似乎都表现得更好:
%timeit -n 10 df.loc[df.groupby(['A', 'B']).C.max == df.C]
10 loops, best of 3: 25.7 ms per loop
%timeit -n 10 df.sort_values('C').drop_duplicates(subset=['A', 'B'], keep='last')
10 loops, best of 3: 101 ms per loop
Run Code Online (Sandbox Code Playgroud)
小智 13
您可以通过使用pandas drop repeats函数简单地完成此操作
df.drop_duplicates(['A','B'],keep= 'last')
Run Code Online (Sandbox Code Playgroud)
我认为groupby应该有效.
df.groupby(['A', 'B']).max()['C']
Run Code Online (Sandbox Code Playgroud)
如果需要数据帧,可以链接重置索引调用.
df.groupby(['A', 'B']).max()['C'].reset_index()
Run Code Online (Sandbox Code Playgroud)
小智 5
你可以drop_duplicates随心所欲
# initialisation
d = pd.DataFrame({'A' : [1,1,2,3,3], 'B' : [2,2,7,4,4], 'C' : [1,4,1,0,8]})
d = d.sort_values("C", ascending=False)
d = d.drop_duplicates(["A","B"])
Run Code Online (Sandbox Code Playgroud)
如果获得相同的订单很重要
d = d.sort_index()
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
58077 次 |
| 最近记录: |