簡體   English   中英

Pandas - 將函數應用於具有來自不同列的多個參數的數據幀

[英]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')

在此先感謝您的幫助! 祝你有美好的一天!

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)

這樣的事情怎么樣:

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM