[英]How to apply a function with several dataframe columns as arguments?
[英]Pandas - Apply a function to a dataframe with several arguments from different columns
由于 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')
在此先感谢您的帮助! 祝你有美好的一天!
正如您在错误消息中看到的那样,如果您想将函数名称用于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)
我个人认为 lambda 使事情变得更加方便。 在您的情况下,您定义函数然后使用另一个 lambda 的原始方式根本不方便,因为lambda
是不必使用def
。 但是,您可以使用 lambda 并使其更方便,因为您在问题的最后一部分中尝试过。
错误的原因是因为函数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)
这样的事情怎么样:
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')
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.