python - 在 pandas 数据框中如何应用自己的函数多选择列并为该计算创建一个新列

标签 python python-3.x pandas data-science

我的数据框(df)由 47 列和 30,000 行组成,列如下

Index(['Unnamed: 0', 'CtpJobId', 'TransformJobStateId', 'LastError',
       'PriorityDate', 'QueuedTime', 'AccurateAsOf', 'SentToDevice',
       'StartedAtDevice', 'ProcessStart', 'LastProgressAt', 'ProcessEnd',
       'OutputFileDuration', 'Tags', 'SegmentId', 'VideoId',
       'ClipFirstFrameNumber', 'ClipLastFrameNumber', 'SourceId',
       'SourceNamedLocation', 'SourceDirectory', 'SourceFileSize',
       'srcMediaFormat', 'srcFrameRate', 'srcWidth', 'srcHeight', 'srcCodec',
       'srcDuration', 'TargetId', 'TargetNamedLocation', 'TargetDirectory',
       'TargetFilename', 'Description', 'TargetTags', 'tgtFrameRate',
       'tgtDropFrame', 'tgtWidth', 'tgtHeight', 'tgtCodec', 'DeviceType',
       'DeviceResourceId', 'AssignedDeviceId', 'DeviceName',
       'AssignedDeviceJobId', 'DeviceUri'],
      dtype='object')

我想为选择性列或该数据框应用一个函数来创建一个名为 df['seg_duration'] 的新列,所以我的函数如下

def seq_duration(df):

    if ClipFirstFrameNumber is not None and ClipLastFrameNumber is not None:
        fn = ClipLastFrameNumber -ClipFirstFrameNumber
        if FrameRate =='23.98' and DropFrame == 'False' :
            fps = 24 / 1.001
        elif FrameRate == '24' and DropFrame == 'False':
            fps = 24
        elif FrameRate == '25'and DropFrame == 'False':
            fps = 25
        elif  FrameRate == '29.97':
            fps = 30 / 1.001
        elif  FrameRate == '30' and DropFrame == 'False':
            fps = 30
        elif FrameRate == '59.94':
            fps = 60 / 1.001
        Duration = fn/fps

    elif srcDuration is not None:
         Duration = srcDuration
    else:
        None

该函数实际上有 3 种情况,其中一种情况有很多条件,所以首先我从 ClipLastFrameNumber 到 ClipFirstframeNumber 列中减去值并将其保存到 fn 变量。并应用其他逻辑,与 srcDuration 相同,是列及其值。比如下面这样

ClipLastFrameNumber ClipFirstFrameNumber    tgtDropFrame    tgtFrameRate
NaN                    NaN                    True          29.97
NaN                    NaN                    True          29.97
NaN                    NaN                    True          29.97
34354.0                28892.0                True          29.97

当我如下应用此功能时

df['seg_duration']=df.apply(seq_duration)

我收到错误NameError:(“名称'ClipFirstFrameNumber'未定义”,'发生在索引未命名:0')

这是为 pandas 编写函数的正确方法吗?或者我如何将此函数用于该数据框并实现基于该函数创建新列 df['seg_dur'] 的目标。提前致谢

最佳答案

稍微修改一下你的函数:

def seq_duration(row):
    Duration = None
    if row.ClipFirstFrameNumber is not None and row.ClipLastFrameNumber is not None:
        fn = row.ClipLastFrameNumber -row.ClipFirstFrameNumber
        fps = 0
        if row.FrameRate =='23.98' and row.DropFrame == 'False' :
            fps = 24 / 1.001
        elif row.FrameRate == '24' and row.DropFrame == 'False':
            fps = 24
        elif row.FrameRate == '25'and row.DropFrame == 'False':
            fps = 25
        elif  row.FrameRate == '29.97':
            fps = 30 / 1.001
        elif  row.FrameRate == '30' and row.DropFrame == 'False':
            fps = 30
        elif row.FrameRate == '59.94':
            fps = 60 / 1.001
        if fps>0:
            Duration = fn/fps

    elif row.srcDuration is not None:
         Duration = row.srcDuration

    return Duration

那么你想要:

df['seg_duration']=df.apply(seq_duration,axis = 1)

关于python - 在 pandas 数据框中如何应用自己的函数多选择列并为该计算创建一个新列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51310636/

相关文章:

python - 如何动态创建 PyQt 属性

java - Pylucene Eclipse 插件

python - 编写一个与 wpa_supplicant 交互的外部程序

python-3.x - 如何使用内存有限的python处理两个或多个Big CSV文件?

python - 使用 pandas 获取聚合行值的样本

python - 检查列表中两个 Dataframe 列中是否存在数据

python - 在没有字符串切片的情况下打印字符串中的奇数字符?

python - 为什么变量的类型提示不作为函数参数的类型提示处理?

python - 安装后没有名为 'tensorflow_examples' 的模块

python - Pandas 根据条件移动列数据