【问题标题】:Pandas - Apply a function to a dataframe with several arguments from different columnsPandas - 将函数应用于具有来自不同列的多个参数的数据框
【发布时间】:2020-03-09 01:59:35
【问题描述】:

感谢 pandas date_range() 函数,我想对数据框使用 apply() 函数来生成日期范围。

以下代码有效,并且符合我的预期。

import pandas as pd

def my_date_range(start, end, freq):
    return pd.date_range(start = start, end = end, freq = freq)

df = pd.DataFrame({'Start':[pd.Timestamp('1970-01-02 00:00:00')], 'End':[pd.Timestamp('1970-01-02 00:30:00')], 'Freq':[pd.Timedelta(5,'m')]})

df1 = df.apply(lambda x: my_date_range(x.Start, x.End, x.Freq), axis=1)

结果:

In [28]: df
Out[28]: 
       Start                 End     Freq
0 1970-01-02 1970-01-02 00:30:00 00:05:00

In[29] : df1[0]
Out[29]: 
DatetimeIndex(['1970-01-02 00:00:00', '1970-01-02 00:05:00',
               '1970-01-02 00:10:00', '1970-01-02 00:15:00',
               '1970-01-02 00:20:00', '1970-01-02 00:25:00',
               '1970-01-02 00:30:00'],
              dtype='datetime64[ns]', freq='5T')

所以现在我的问题/我的问题。 据我了解,我可以读到可以以这种方式在没有 lambda 的情况下使用 apply():

df2 = df[['Start', 'End', 'Freq']].apply(my_date_range, axis=1)

但上面的代码会产生以下错误。

TypeError: ("my_date_range() missing 2 required positional arguments: 'end' and 'freq'", 'occurred at index 0')

请问,我做错了什么?

避免使用 lambda 有意思吗? (更好的表现?)

最后还有没有办法直接使用pd.date_range?

如果我尝试使用以下代码,则会收到以下错误:

df1 = df.apply(lambda x: pd.date_range(x.Start, x.End, x.Freq), axis=1)

"periods must be a number, got {periods}".format(periods=periods)

TypeError: ('periods must be a number, got 0 days 00:05:00', 'occurred at index 0')

提前感谢您的帮助! 祝你有美好的一天!

【问题讨论】:

    标签: python pandas apply


    【解决方案1】:

    1

    正如你在错误信息中看到的,如果你想使用pandas.DataFrame.apply的函数名,函数应该以pandas.Series作为参数。所以应该是这样的。

    def my_date_range(x):
        return pd.date_range(start = x.Start, end = x.End, freq = x.Freq)
    df2 = df.apply(my_date_range, axis=1)
    

    2

    我个人认为 lambda 让事情变得更加方便。在您的情况下,您使用定义函数然后使用另一个 lambda 的原始方式根本不方便,因为 lambda 的点不必使用 def。但是,您可以使用 lambda 并使其更方便,就像您在问题的最后一部分中尝试的那样。

    3

    错误的原因是因为函数pd.date_range参数是这样的。 pandas.date_range(start=None, end=None, periods=None, ...) 所以如果你只是像你一样把它作为一个位置参数,它认为第三个参数是period=。你应该把它作为一个关键字参数(就像你在上面所做的那样)。

    df1 = df.apply(lambda x: pd.date_range(start = x.Start, end = x.End, freq = x.Freq), axis=1)
    

    【讨论】:

      【解决方案2】:

      这样的事情怎么样:

      import pandas as pd
      start = pd.Timestamp('1970-01-02 00:00:00')
      end = pd.Timestamp('1970-01-02 00:30:00')
      pd.date_range(start, end, freq='5Min')
      

      【讨论】:

      • 您好,感谢您的回复。该示例是自愿简化的,但我确实想在数据帧上应用 date_range 函数,而不是单个不同的值。
      猜你喜欢
      • 1970-01-01
      • 2017-06-17
      • 1970-01-01
      • 2013-11-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多