在多列上使用R lappy到Python等价物?

2024-09-30 16:20:37 发布

您现在位置:Python中文网/ 问答频道 /正文

我目前正试图找到一种pythonic的方法来“翻译”下面的R代码,它接收一个数据帧,其中有三列,分别是“strikeDeg”、“dipDeg”和“rakeDeg”,并附加三列:

  • 旋转=9元素向量
  • 极点=三元向量
  • 方向=三元向量

这是一个更大的if循环的一部分,用于根据哪些列不为NULL来解析原始数据帧

geoPoleDirectionRotationFromData <- function(dataFrame) {
    newFrame <- emptyDataFrame(nrow(dataFrame))
      # Make rotation, pole, direction from strike, dip, rake.
    newFrame$rotation <- lapply(1:nrow(dataFrame),
                              function(i) geoRotationFromStrikeDipRakeDeg(
                                c(dataFrame[i,]$strikeDeg, dataFrame[i,]$dipDeg, dataFrame[i,]$rakeDeg)))
    newFrame$pole <- lapply(1:nrow(newFrame), function(i) newFrame$rotation[[i]][1,])
    newFrame$direction <- lapply(1:nrow(newFrame), function(i) newFrame$rotation[[i]][2,])
    newFrame

问题代码的一部分是如何在python中输入dataFrame的3个现有列上的3个新列中的每一个中执行lappy()函数?我需要从dataFrame的现有列创建一个向量并应用map()函数吗


Tags: 函数代码dataframefunction向量directionrotation正试图
1条回答
网友
1楼 · 发布于 2024-09-30 16:20:37

只需使用apply函数,并指定axis以匹配要应用它的维度

您可以在下面的link中看到一个示例

在列上应用函数的简单示例:

import pandas as pd

matrix = [(222, 34, 23),
         (333, 31, 11),
         (444, 16, 21),
         (555, 32, 22),
         (666, 33, 27),
         (777, 35, 11)
         ]

# Create a DataFrame object
dfObj = pd.DataFrame(matrix, columns=list('abc'))
print(dfObj)

modDfObj = dfObj.apply(lambda x : x + 10) 
print(modDfObj)

我得到以下输出:

     a   b   c
0  222  34  23
1  333  31  11
2  444  16  21
3  555  32  22
4  666  33  27
5  777  35  11

     a   b   c
0  232  44  33
1  343  41  21
2  454  26  31
3  565  42  32
4  676  43  37
5  787  45  21

你可以看到,唯一的变化是在所有的列,你可以很容易地概括为你的愿望(例如)要应用于一个或多个特定列,可以将apply行更改为以下任一选项:

modDfObj = dfObj.apply(lambda x: x + 10 if x.name == 'b' else x)
modDfObj = dfObj.apply(lambda x: x + 10 if (x.name == 'b' or x.name == 'c') else x) 

相关问题 更多 >