R 阶函数的 Python 等效项

标签 python r pandas

根据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/

相关文章:

python - 如何在 SqlAlchemy 中查询具有分钟/小时步长间隔的行?

r - 为什么自写的 Rcpp 向量化数学函数比它的基本函数更快?

r - 在 Windows 中使用 sendmailR

python - 如何让 Pandas 读取 SPSS 文件?

python - 绘制数据帧引发序数值错误必须 >= 1

python - 与 TfidfVectorizer.fit_transform 的返回结果混淆

python - 在 Sympy 中解决递归问题

python - App Engine Python 模块基本和手动缩放不起作用

r - 如何比较数据框中的列表

datetime.now() 和充满日期的 Series 之间的 Python 年差异?