根据this post np.argsort()
将是我正在寻找的函数。
但是,这并没有给我我想要的结果。
下面是我尝试转换为 Python 的 R 代码和我当前的 Python 代码。
R 代码
data.frame %>% select(order(colnames(.)))
Python 代码
dataframe.iloc[numpy.array(dataframe.columns).argsort()]
我正在使用的数据帧有 1,000,000 多行和 42 列,因此我无法完全重新创建输出。
但我相信我可以重新创建 order()
输出。
据我了解,每个数字代表列列表中的原始位置
order(colnames(data.frame))
返回
3,2,5,6,8,4,7,10,9,11,12,13,14,15,16,17,18,19,23,20,21,22,1,25,26, 28,24,27,38,29,34,33,36,30,31,32,35,41,42,39,40,37
numpy.array(dataframe.columns).argsort()
返回
2,4,5,7,3,6,9,8,10,11,12,13,14,15,16,17,18,22,19,20,21,0,24,25,27, 23,26,37,28,33,32,35,29,30,31,34,40,41,38,39,36,1
我知道R不像python那样有0索引,所以我知道前两个数字3和2是相同的。
我正在寻找可能在 R 代码中返回相同顺序的 python 代码。
最佳答案
你有混合大小写吗?这在 python 和 R 中处理方式不同。
R:
order(c('a', 'b', 'B', 'A', 'c'))
# [1] 1 4 2 3 5
x <- c('a', 'b', 'B', 'A', 'c')
x[order(c('a', 'b', 'B', 'A', 'c'))]
# [1] "a" "A" "b" "B" "c"
Python:
np.argsort(['a', 'b', 'B', 'A', 'c'])+1
# array([4, 3, 1, 2, 5])
x = np.array(['a', 'b', 'B', 'A', 'c'])
x[np.argsort(x)]
# array(['A', 'B', 'a', 'b', 'c'], dtype='<U1')
您可以使用 numpy.lexsort
来模仿 R 的行为并按小写字母排序,然后按交换大小写的原始数组排序:
x = np.array(['a', 'b', 'B', 'A', 'c'])
x[np.lexsort([np.char.swapcase(x), np.char.lower(x)])]
# array(['a', 'A', 'b', 'B', 'c'], dtype='<U1')
关于R 阶函数的 Python 等效项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/74528672/