![](/img/trans.png)
[英]How to return a value based on column value and Timestamp using user-defined function in pandas
[英]How do you get two functions to return when using a user-defined function?
我剛剛開始使用用戶定義的函數,所以請原諒這可能不是一個非常復雜的問題。
我有幾個數據框,所有的數據框都有一個名為“ interval_time”的列(例如),我想將此列重命名為“ Timestamp”,然后將此重命名的列設置為索引。
我知道我可以用這個手動完成;
df = df.rename(index=str, columns={'interval_time': 'Timestamp'})
df = df.set_index('Timestamp')
但現在我想定義一個名為重命名的函數來為我完成此任務。 我已經看到這行得通;
def rename_col(data, col_in='tempus_interval_time', col_out='Timestamp'):
return data.rename(index=str, columns={col_in: col_out}, inplace=True)
但是,當我嘗試添加第二個函數時,它似乎沒有任何作用,但是,如果我將第二個部分定義為其自己的函數並運行它,則它似乎確實可以工作。
我正在嘗試
def rename_n_index(data, col_in='tempus_interval_time', col_out='Timestamp'):
return data.rename(index=str, columns={col_in: col_out}, inplace=True)
return data.set_index('Timestamp', inplace=True)
我正在使用的數據框具有以下形式;
df_scada
interval_time A ... X Y
0 2010-11-01 00:00:00 0.0 ... 396.36710 381.68860
1 2010-11-01 00:05:00 0.0 ... 392.97974 381.40634
2 2010-11-01 00:10:00 0.0 ... 390.15695 379.99493
3 2010-11-01 00:15:00 0.0 ... 389.02786 379.14810
您不需要返回任何東西 ,因為您的操作已就位 。 您可以在函數中進行就地更改:
def rename_n_index(data, col_in='tempus_interval_time', col_out='Timestamp'):
data.rename(index=str, columns={col_in: col_out}, inplace=True)
data.set_index('Timestamp', inplace=True)
您傳遞給函數的數據框的任何其他引用都將看到所做的更改:
>>> import pandas as pd
>>> df = pd.DataFrame({'interval_time': pd.to_datetime(['2010-11-01 00:00:00', '2010-11-01 00:05:00', '2010-11-01 00:10:00', '2010-11-01 00:15:00']),
... 'A': [0.0] * 4}, index=range(4))
>>> df
A interval_time
0 0.0 2010-11-01 00:00:00
1 0.0 2010-11-01 00:05:00
2 0.0 2010-11-01 00:10:00
3 0.0 2010-11-01 00:15:00
>>> def rename_n_index(data, col_in='tempus_interval_time', col_out='Timestamp'):
... data.rename(index=str, columns={col_in: col_out}, inplace=True)
... data.set_index('Timestamp', inplace=True)
...
>>> rename_n_index(df, 'interval_time')
>>> df
A
Timestamp
2010-11-01 00:00:00 0.0
2010-11-01 00:05:00 0.0
2010-11-01 00:10:00 0.0
2010-11-01 00:15:00 0.0
在上面的示例中,對數據幀的df
引用顯示了該函數所做的更改。
如果刪除inplace=True
參數,則該方法調用將返回一個新的dataframe對象。 您可以將中間結果存儲為局部變量,然后將第二種方法應用於該局部變量中引用的數據框:
def rename_n_index(data, col_in='tempus_interval_time', col_out='Timestamp'):
renamed = data.rename(index=str, columns={col_in: col_out})
return renamed.set_index('Timestamp')
或者,您可以將方法調用直接鏈接到返回的對象:
def rename_n_index(data, col_in='tempus_interval_time', col_out='Timestamp'):
return data.rename(index=str, columns={col_in: col_out})\
.set_index('Timestamp'))
因為renamed
已經是一個新的數據幀,所以可以將set_index()
調用就地應用於該對象,然后也返回剛剛renamed
:
def rename_n_index(data, col_in='tempus_interval_time', col_out='Timestamp'):
renamed = data.rename(index=str, columns={col_in: col_out})
renamed.set_index('Timestamp', inplace=True)
return renamed
無論哪種方式,這都會返回一個新的數據框對象,而使原始數據框保持不變:
>>> def rename_n_index(data, col_in='tempus_interval_time', col_out='Timestamp'):
... renamed = data.rename(index=str, columns={col_in: col_out})
... return renamed.set_index('Timestamp')
...
>>> df = pd.DataFrame({'interval_time': pd.to_datetime(['2010-11-01 00:00:00', '2010-11-01 00:05:00', '2010-11-01 00:10:00', '2010-11-01 00:15:00']),
... 'A': [0.0] * 4}, index=range(4))
>>> rename_n_index(df, 'interval_time')
A
Timestamp
2010-11-01 00:00:00 0.0
2010-11-01 00:05:00 0.0
2010-11-01 00:10:00 0.0
2010-11-01 00:15:00 0.0
>>> df
A interval_time
0 0.0 2010-11-01 00:00:00
1 0.0 2010-11-01 00:05:00
2 0.0 2010-11-01 00:10:00
3 0.0 2010-11-01 00:15:00
有關解決代碼中的錯誤的信息,請參見@MartijnPieters的說明 。
但是,請注意Pandorable方法是使用方法鏈接。 有些人發現從外觀上看方法名稱在美學上令人愉悅。 這是一個例子:
def rename_n_index(data, col_in='tempus_interval_time', col_out='Timestamp'):
renamed = data.rename(index=str, columns={col_in: col_out})\
.set_index('Timestamp')
return renamed
然后,將這些應用到dataframes序列在以前的問題 :
dfs = [df.pipe(rename_n_index) for df in (df1, df2, df3)]
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.