【问题标题】:how to apply function over multiple rows如何在多行上应用函数
【发布时间】:2020-08-19 18:26:08
【问题描述】:

我使用 pandas 将一列中的一系列周期范围分成两列,即 Date = 100-120 --> EarliestDate = 100,LatestDate = 120

唯一的问题是某些范围还包含缩写(即 150-56 或 225-26,会导致不良结果,例如 {150, 56} 和 {225-26})

我正在尝试编写一个扩展缩写的函数。类似的东西

def expansion(x, y):
    for x in data_frame['EarliestDate']:
       for y in data_frame['LatestDate']:
         if x>100 and y>100 and y<x:
           return (math.floor(x/100))*100 + y)
         else:
           pass

基本上,我取最早范围内的数字,除以 100,用 math.floor 将其四舍五入,然后将其添加到后面的范围(因此 56 将变回 156)。我不确定这是否是最有效的方法(也许转换为字符串并使用正则表达式会更好?)我还必须为日期范围涉及日期 1-99 或负日期(即-110)

但我的主要问题是当我将它作为 lambda 函数应用时:

data_frame['LatestDate'] = data_frame[['EarliestDate', 'LatestDate']].apply(lambda x: expansion(x.EarliestDate, x.LatestDate), axis=1)

lambda 函数的结果只是用相同的单个值 (79) 覆盖 'LatestDate' 中的所有原始正确值(即使条件未获得)。我不知道为什么会这样——非常感谢。

【问题讨论】:

    标签: python-3.x pandas csv


    【解决方案1】:

    尝试.loc 而不是多个 for 循环:

    data_frame.loc[(data_frame.EarliestDate >100) & (data_frame.LatestDate >100) &(data_frame.EarliestDate > data_frame.LatestDate), 'newCol'] = math.floor(data_frame.loc[(data_frame.EarliestDate >100) & (data_frame.LatestDate >100) &(data_frame.EarliestDate > data_frame.LatestDate), 'EarliestDate'] /100 )*100+  data_frame.loc[(data_frame.EarliestDate >100) & (data_frame.LatestDate >100) &(data_frame.EarliestDate > data_frame.LatestDate), 'LatestDate']
    

    您可以使用掩码选择条件为真的所有行:

    mask = (data_frame.EarliestDate >100) & (data_frame.LatestDate >100) &(data_frame.EarliestDate > data_frame.LatestDate)
    

    您可以使用.loc 使用以下语法选择这些行:

    data_frame.loc[mask, 'newCol']
    

    第二个参数是一个列索引,其中newCol 将是data_frame 中的一个新列,因为它还不存在。然后在等号的另一边,您使用相同的掩码并使用指定的列进行计算。掩码无效的任何地方都会留下NaN

    【讨论】:

    • 非常感谢!你的解决方案很有帮助——我只发现了一件事:我应该使用 numpy 而不是数学。此外,在 y>100 的条件下,我得到了一些不正确的结果,但你的方式完全解析了它是如何做到的。谢谢!
    猜你喜欢
    • 1970-01-01
    • 2017-10-29
    • 2017-08-02
    • 1970-01-01
    • 2021-12-28
    • 1970-01-01
    • 2023-04-08
    • 1970-01-01
    • 2022-07-06
    相关资源
    最近更新 更多