panda中的apply()方法介绍

1.apply()说明

作用范围:pandas中的SeriesDataFrame
作用:通过使用apply()方法,我们可以调用自己定义的函数,使得代码结构更加清晰,简洁。
注意:apply()方法不会改变原数据,所以要赋值df = df.apply()

2.apply()的应用过程

如果一个SeriesDataFrame调用apply()方法,然后使用自己定义的函数,其中自定义的函数的第一个参数,代表的是SeriesDataFrame的下一个“纬度”
比如说如果是DataFrame,则参数是他的每一个列。如果是Series,则是他的每一个值。

(1)DataFrame,参数是他的每一个列
eg:计算一个DataFrame各个字段的偏度和峰度

import pandas as pd
import numpy as np

df = pd.DataFrame({
    'key1':[1, 2, 3, 4, 5],
    'key2':[4, 5, 6, 2, 1]
})

def skew_kurt(x):
    print(x, type(x))
    skews = x.skew()
    kurts = x.kurt()
    return pd.Series([skews, kurts], index=['skew', 'kurt']) # Series的参数为Series,则会变为DataFrame,且参数变为列
print(df.apply(skew_kurt))


# 结果:
0    1
1    2
2    3
3    4
4    5
Name: key1, dtype: int64 <class 'pandas.core.series.Series'>
0    1
1    2
2    3
3    4
4    5
Name: key1, dtype: int64 <class 'pandas.core.series.Series'>
0    4
1    5
2    6
3    2
4    1
Name: key2, dtype: int64 <class 'pandas.core.series.Series'>
      key1      key2
skew   0.0 -0.235514
kurt  -1.2 -1.963223

通过输出结果中的可以看到,该函数会执行多次,且每次执行都会将DataFrame中的某一列传过去。
(2)Series,参数是他的每一个值
eg:将一个Series的每一个值用该值的第一个字符替换

import pandas as pd
import numpy as np

s = pd.Series(['wang', 'li', 'zhao'])

def text(x):
    print(x, type(x))
    return x[0] # Series的参数为Series,则会变为DataFrame,且参数变为列
print(s.apply(text))

# 结果:
wang <class 'str'>
li <class 'str'>
zhao <class 'str'>
0    w
1    l
2    z
dtype: object

3.apply()应用

(1)通过上面的例子,我们可以看见其可以应用于SeriesDataFrame
(2)apply()方法还可以应用于分组—groupby()参数也是代表下一个纬度
eg:

import pandas as pd
import numpy as np

df = pd.DataFrame({'data1':np.random.rand(5),
                  'data2':np.random.rand(5),
                  'key1':list('aabba'),
                  'key2':['one','two','one','two','one']})

print(df.groupby('key1').apply(lambda x: x.describe()))

# 结果:
a    count  3.000000  3.000000
     mean   0.693046  0.608697
     std    0.257070  0.522231
     min    0.396401  0.011814
     25%    0.614231  0.422315
     50%    0.832060  0.832817
     75%    0.841368  0.907138
     max    0.850676  0.981459
b    count  2.000000  2.000000
     mean   0.352287  0.482039
     std    0.343271  0.675147
     min    0.109558  0.004638
     25%    0.230922  0.243339
     50%    0.352287  0.482039
     75%    0.473651  0.720740
     max    0.595016  0.959441

4.小结
  • 通过使用apply()方法,我们可以调用自己定义的函数,使得代码结构更加清晰,简洁。
  • 自定义的函数的第一个参数,代表的是下一个“纬度”

这里是引用

  • 5
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 4
    评论
### 回答1: Panda3d可以通过使用Loader类的loadModel方法来加载.obj文件。但是,要加载包含材质信息的.mtl文件,需要使用Panda3d的Material类来加载和应用材质。具体来说,可以使用Material类的load方法来加载.mtl文件,然后使用loadModel方法加载.obj文件,并使用Material类apply方法将材质应用到模型上。 ### 回答2: Panda3D是一个功能强大的游戏开发引擎,它支持加载和渲染多种不同的3D模型文件格式,包括Obj和Mtl。 要加载Obj和Mtl文件,首先需要将这两个文件放置在Panda3D项目的资源文件夹。然后,我们可以使用Panda3D提供的模型加载器和纹理加载器来加载这些文件。加载过程可以通过以下代码实现: ``` from panda3d.core import loadPrcFileData from panda3d.core import Filename # 首先设置资源路径,以便Panda3D能够找到模型和纹理文件 loadPrcFileData('', 'model-path ./resources') from panda3d.core import Shader from direct.showbase.ShowBase import ShowBase from panda3d.core import Material class MyApp(ShowBase): def __init__(self): ShowBase.__init__(self) # 加载模型 objFile = 'model.obj' objModel = self.loader.loadModel(Filename.fromOsSpecific(objFile)) objModel.reparentTo(self.render) # 加载纹理 mtlFile = 'model.mtl' objModel.setTexture(self.loader.loadTexture(Filename.fromOsSpecific(mtlFile))) self.run() app = MyApp() ``` 在这个例子,我们首先导入了必要的Panda3D模块。然后,我们设置了模型和纹理文件的路径,以便Panda3D能够找到它们。接下来,我们使用`loadModel`函数加载Obj模型文件,并使用`setTexture`函数将加载的纹理应用到模型上。最后,我们创建了一个应用程序实例并启动游戏循环。 这是加载Obj和Mtl文件的基本过程。请注意,你需要将实际的文件名替换为正确的文件路径和名称。此外,你还可以根据自己的需求进行进一步的模型和纹理设置,例如调整模型位置、旋转、缩放等。 ### 回答3: 在Panda3D加载.obj和.mtl文件可以通过以下步骤实现。 首先,需要导入Panda3D的相关模块: ``` from panda3d.core import * from direct.showbase.ShowBase import ShowBase ``` 接下来,创建一个ShowBase类的子类,并在其构造函数进行一些初始化设置: ``` class MyApp(ShowBase): def __init__(self): ShowBase.__init__(self) self.setBackgroundColor(0.8, 0.8, 0.8) # 设置背景颜色 ``` 然后,在MyApp类创建一个方法来加载.obj和.mtl文件: ``` def load_model(self): # 加载.obj文件 obj_filename = "path_to_obj_file.obj" obj_node_path = self.loader.loadModel(obj_filename) obj_node_path.reparentTo(self.render) # 加载.mtl文件 mtl_filename = "path_to_mtl_file.mtl" materials = Loader.loadMaterials(mtl_filename) # 给模型的每个部分应用材质 for node in obj_node_path.findAllMatches("**/+GeomNode"): geom_node = node.node() for i in range(geom_node.getNumGeoms()): geom = geom_node.getGeom(i) geom_state = geom_node.getGeomState(i) geom_geom_node = GeomNode('mesh') geom_geom_node.addGeom(geom) obj_node_path = self.render.attachNewNode(geom_geom_node) obj_node_path.setGeomState(0, geom_state) # 获取当前部分的材质并应用 first_vertex = geom.firstVertex() last_vertex = geom.lastVertex() prim = geom.getPrimitive(0) material_index = prim.getMaterialIndex(0) material = materials.get(material_index) obj_node_path.setMaterial(material) obj_node_path.setPos(0, 0, 0) # 设置模型位置 ``` 最后,在MyApp类添加启动方法并运行应用程序: ``` if __name__ == "__main__": app = MyApp() app.load_model() # 调用加载模型的方法 app.run() ``` 在这个例子,需要将"path_to_obj_file.obj"和"path_to_mtl_file.mtl"替换为实际的.obj和.mtl文件的路径。加载的.obj文件将与其关联的.mtl文件一起加载,并将其的材质应用到模型的不同部分上。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ElegantCodingWH

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值