有没有方法可以测试数据框是否按照非索引的给定列进行排序(即,对于非索引列,是否存在与is_monotonic()的等效值)而不调用再次重新排序,并且不将列转换为索引?检查是否在Pandas中排序的非索引列
回答
pd.algos
有一些功能可能有用。他们都是无证实现细节,所以他们可能从发行版本而变化:
>>> pd.algos.is[TAB]
pd.algos.is_lexsorted pd.algos.is_monotonic_float64 pd.algos.is_monotonic_object
pd.algos.is_monotonic_bool pd.algos.is_monotonic_int32
pd.algos.is_monotonic_float32 pd.algos.is_monotonic_int64
的is_monotonic_*
函数采用指定的D型和“类时”布尔应该是False
大多数用例的阵列。 (Pandas将它设置为True
,涉及时间表示为整数的情况。)返回值是一个元组,其第一个元素表示数组是单调不递减的,第二个元素表示数组是单调不递增的。其他元组元素是版本相关:
>>> df = pd.DataFrame({"A": [1,2,2], "B": [2,3,1]})
>>> pd.algos.is_monotonic_int64(df.A.values, False)[0]
True
>>> pd.algos.is_monotonic_int64(df.B.values, False)[0]
False
所有这些功能假定一个特定的输入D型细胞,甚至is_lexsorted
,其中假定输入是int64
阵列的列表。它传递了错误的D型,它变得非常困惑:
In [32]: pandas.algos.is_lexsorted([np.array([-2, -1], dtype=np.int64)])
Out[32]: True
In [33]: pandas.algos.is_lexsorted([np.array([-2, -1], dtype=float)])
Out[33]: False
In [34]: pandas.algos.is_lexsorted([np.array([-1, -2, 0], dtype=float)])
Out[34]: True
我不完全知道为什么系列还没有某种短路is_sorted
。可能有些东西会使它比看起来更复杂。
可以使用numpy的方法:
import numpy as np
def is_df_sorted(df, colname):
return (np.diff(df[colname]) > 0).all()
更直接的方式(如你的建议,但你说你不希望它..)被转换成一个索引,使用is_monotonic
属性:
import pandas as pd
def is_df_sorted(df, colname):
return pd.Index(df[colname]).is_monotonic
谢谢shx2!这符合我的目标,但事实证明: assert(df.column.diff()[1:] <= 0).all()
(diff的第一个值是NaN)比仅用mergesort进行排序要慢。另外,is_monotonic()不能容忍弱单调列,所以在我的情况下不起作用。 :/但也许在一个更大的数据集比较会收益。 –
2015-02-09 22:04:18
也许使用'> = 0'? – DSM 2015-02-09 22:05:44
我正在排序降序,所以我可以抢第一项... – 2015-02-09 22:08:31
- 1. 检查表列上是否存在非聚簇索引
- 2. 检查pandas数据框是否被编入索引?
- 3. 检查WebSQL中是否存在索引
- 4. 检查是否连续排序列表
- 5. 检查列是否已排序
- 6. 在pandas的多索引级别内按列排序
- 7. 检查当前页面是否是索引中的索引
- 8. 在列表中的所有索引处检查是否相等
- 9. 检查ArrayList是否排序
- 10. 检查索引是否是最新的?
- 11. 检查数组索引是否存在
- 12. RavenDb检查索引是否存在
- 13. 检查矩阵索引是否存在
- 14. 检查列表中是否存在索引
- 15. 检查索引是否在2d列表中[Python]
- 16. 排序后检索索引值Enum按字母顺序排列
- 17. 用基数排序检查索引
- 18. 返回在pandas中跳过nan值的排序索引?
- 19. 如何检查列表是否在球拍中排序?
- 20. 如何检查索引是否包含SQLite中的特定列
- 21. 检查列表的索引是否存在
- 22. 在索引列上排序
- 23. 检查序列中是否存在值
- 24. 检查元素是否在序列中
- 25. 如何检查索引列上的排序?
- 26. Python Pandas按多重索引和列排序
- 27. 将pandas DataFrame按多列和重复索引排序
- 28. 在非聚集索引中,第二,第三,第四...列是如何排序的?
- 29. 检查列索引
- 30. 在Pandas中排序
这两个惊人的指向我这个pd.algos库,并提示!任何你知道任何简单的方法来处理降序排序的机会?我想要它排序,所以我可以拉第一(最大)行。我可以调用len()并根据需要获取最后一行,只是寻找速度。 – 2015-02-09 22:15:37
@nick_eu:不是,我很害怕。尽管如此,你总是可以使用'.iloc [-1]'获取最后一行。当然是 – DSM 2015-02-09 22:23:15
!没有想到这一点。谢谢! – 2015-02-09 22:28:18