【问题标题】:Python: use a function in pandas lambda expressionPython:在熊猫 lambda 表达式中使用函数
【发布时间】:2016-04-01 17:59:45
【问题描述】:

我有以下代码,试图在数据框中查找“日期”列的小时:

print(df['Dates'].head(3))
df['hour'] = df.apply(lambda x: find_hour(x['Dates']), axis=1)

def find_hour(self, input):
    return input[11:13].astype(float)

print(df['Dates'].head(3)) 的样子:

0    2015-05-13 23:53:00
1    2015-05-13 23:53:00
2    2015-05-13 23:33:00

但是,我收到以下错误:

    df['hour'] = df.apply(lambda x: find_hour(x['Dates']), axis=1)
NameError: ("global name 'find_hour' is not defined", u'occurred at index 0')

有人知道我错过了什么吗?谢谢!


请注意,如果我将函数直接放在 lambda 行中,如下所示,一切正常:

df['hour'] = df.apply(lambda x: x['Dates'][11:13], axis=1).astype(float)

【问题讨论】:

  • 如果 x 是 datetime 对象并且 self 应该是什么,您也可以直接从 x 中提取小时?

标签: python pandas lambda dataframe


【解决方案1】:

您正在尝试使用尚未定义的find_hour。你只需要换个方式:

def find_hour(self, input):
    return input[11:13].astype(float)

print(df['Dates'].head(3))
df['hour'] = df.apply(lambda x: find_hour(x['Dates']), axis=1)

编辑:Padraic 指出了一个非常重要的点:find_hour() 被定义为接受两个参数,selfinput,但你只给它一个。您应该将find_hour() 定义为def find_hour(input):,除非将参数定义为input 会影响内置函数。您可以考虑将其重命名为更具描述性的名称。

【讨论】:

    【解决方案2】:

    老好.dt.hour怎么了?

    In [202]: df
    Out[202]:
                     Date
    0 2015-05-13 23:53:00
    1 2015-05-13 23:53:00
    2 2015-05-13 23:33:00
    
    In [217]: df['hour'] = df.Date.dt.hour
    
    In [218]: df
    Out[218]:
                     Date  hour
    0 2015-05-13 23:53:00    23
    1 2015-05-13 23:53:00    23
    2 2015-05-13 23:33:00    23
    

    如果您的Date 列是字符串类型,您可能需要将其转换为日期时间first

    df.Date = pd.to_datetime(df.Date)
    

    或者只是:

    df['hour'] = int(df.Date.str[11:13])
    

    【讨论】:

      猜你喜欢
      • 2013-08-20
      • 2017-01-24
      • 2018-02-17
      • 2016-04-10
      • 1970-01-01
      • 2018-04-30
      • 1970-01-01
      • 2014-01-30
      • 2019-08-10
      相关资源
      最近更新 更多