我有一个示例数据框如下所示。
df = pd.DataFrame({ 'Area' : ['1', '2', '3', '4','5', '6', '7', '8', '9', '10'],
'Distance' : ['19626207', '20174412', '20175112', '19396352',
'19391124', '19851396', '19221462', '20195112', '21127633', '19989793'],
})
Area Distance
0 1 19626207
1 2 20174412
2 3 20175112
3 4 19396352 # smaller, take out
4 5 19391124 #
5 6 19851396 #
6 7 19221462 #
7 8 20195112
8 9 21127633
9 10 19989793 #
“距离”列需要按升序排序。
但是数据帧的顺序是固定的('Area'的顺序不可更改),
这意味着,如果行比以前的行小,那么 需要取出行。例如,这是我想看到的结果。
Area Distance
1 19626207
2 20174412
3 20175112
8 20195112
9 21127633
我知道我可以尝试for i in range(0, len(index), 1)
...
但是有没有更好的方法来实现使用熊猫的目标?
有任何提示吗?
答案 0 :(得分:3)
UPDATE2:这里是ayhan的解决方案正确:
In [135]: df[df.Distance.astype("int64")>=df.Distance.astype("int64").cummax()]
Out[135]:
Area Distance
0 1 19626207
1 2 20174412
2 3 20174412
7 8 20195112
8 9 21127633
<强>更新强>
以下解决方案 NOT 始终正常运行,因为它会删除所有重复项。因此,如果您在原始DF中存在重复值,它们将消失。
以下是一个例子:
In [122]: df
Out[122]:
Area Distance
0 1 19626207
1 2 20174412 # duplicates
2 3 20174412 # they should BOTH be in the result set
3 4 19396352
4 5 19391124
5 6 19851396
6 7 19221462
7 8 20195112
8 9 21127633
9 10 19989793
In [123]: df.loc[df.Distance.cummax().drop_duplicates().index]
Out[123]:
Area Distance
0 1 19626207
1 2 20174412 # one duplicate has been dropped
7 8 20195112
8 9 21127633
PS我会尝试找到一个可行的解决方案
OLD回答:
我不确定它是否是最有效的方法,但它有效:
In [94]: df.loc[df.Distance.cummax().drop_duplicates().index]
Out[94]:
Area Distance
0 1 19626207
1 2 20174412
2 3 20175112
7 8 20195112
8 9 21127633
说明:
In [98]: df.Distance.cummax()
Out[98]:
0 19626207
1 20174412
2 20175112
3 20175112
4 20175112
5 20175112
6 20175112
7 20195112
8 21127633
9 21127633
Name: Distance, dtype: object