Skip to main content
 首页 » 编程设计

python之使用用户定义的函数时如何让两个函数返回

2025年05月04日14mayingbao

我刚开始使用用户定义的函数,所以这可能不是一个很复杂的问题,请原谅。

我有几个数据帧,它们都有一个名为“interval_time”的列(例如),我想重命名此列“Timestamp”,然后将这个重命名的列放入索引中。

我知道我可以用它手动完成;

df = df.rename(index=str, columns={'interval_time': 'Timestamp'}) 
df = df.set_index('Timestamp') 

但现在我想定义一个名为 rename 的函数来为我做这件事。我已经看到这行得通;

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 参数,方法调用将返回一个新的数据框对象。您可以将中间结果存储为局部变量,然后将第二种方法应用于该局部变量中引用的数据帧:

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