簡體   English   中英

在 python function 中返回一個 dataframe

[英]Returning a dataframe in python function

我正在嘗試從 Python function 創建並返回一個數據框

def create_df():
    data = {'state': ['Ohio','Ohio','Ohio','Nevada','Nevada'],
           'year': [2000,2001,2002,2001,2002],
           'pop': [1.5,1.7,3.6,2.4,2.9]}
    df = pd.DataFrame(data)
    return df
create_df()
df

我收到一條錯誤消息,指出未定義df 如果我用print替換return ,我會正確打印數據框。 有沒有辦法做到這一點?

當您調用create_df()時,Python 會調用該函數,但不會將結果保存在任何變量中。 這就是你得到錯誤的原因。

create_df()的結果分配給一個新變量df ,如下所示:

df = create_df()
df

我在這里有點晚了,但是在函數中創建一個全局變量呢? 它應該為您節省一步。

def create_df():

    global df

    data = {
    'state': ['Ohio','Ohio','Ohio','Nevada','Nevada'],
    'year': [2000,2001,2002,2001,2002],
    'pop': [1.5,1.7,3.6,2.4,2.9]
    }

    df = pd.DataFrame(data)

然后,當您運行 create_df() 時,您將能夠只使用 df。

當然,如果您有一個大型程序,請注意命名策略,以便 df 的值不會隨着各種函數的執行而改變。

編輯:我注意到我得到了一些積分。 這是使用 exec 執行此操作的另一種(可能更糟)方法。 如果需要,這還允許創建多個數據框。

import pandas as pd

def create_df():
    data = {'state': ['Ohio','Ohio','Ohio','Nevada','Nevada'],
           'year': [2000,2001,2002,2001,2002],
           'pop': [1.5,1.7,3.6,2.4,2.9]}
    df = pd.DataFrame(data)
    return df

### We'll create three dataframes for an example
for i in range(3):
    exec(f'df_{i} = create_df()')

然后,您可以測試它們:

輸入: df_0

輸出:

    state  year  pop
0    Ohio  2000  1.5
1    Ohio  2001  1.7
2    Ohio  2002  3.6
3  Nevada  2001  2.4
4  Nevada  2002  2.9

輸入: df_1

輸出:

    state  year  pop
0    Ohio  2000  1.5
1    Ohio  2001  1.7
2    Ohio  2002  3.6
3  Nevada  2001  2.4
4  Nevada  2002  2.9

等等。

函數顯式返回兩個 DataFrame:

import pandas as pd
import numpy as np

def return_2DF():

    date = pd.date_range('today', periods=20)
    DF1 = pd.DataFrame(np.random.rand(20, 2), index=date, columns=list('xyz'))

    DF2 = pd.DataFrame(np.random.rand(20, 4), index=date, columns='A B C D'.split())

    return DF1, DF2

調用並返回兩個數據幀

one, two = return_2DF()

您可以通過復制數據框來從函數返回數據框,例如

def my_function(dataframe):
  my_df=dataframe.copy()
  my_df=my_df.drop(0)
  return(my_df)

new_df=my_function(old_df)
print(type(new_df))

輸出:pandas.core.frame.DataFrame

Dataframe_object.copy()

需要執行深層復制以避免一個數據幀成為另一個數據幀的引用的問題。 當您在模塊(或單獨的文件)中有返回數據幀的函數時,這一點至關重要。 如果您不返回 DataFrame_object.copy(),它只會返回對函數中創建的數據框的引用。\

如果您在同一個文件中使用函數,如果您在函數中使用全局變量,您甚至可能不會意識到深拷貝/淺拷貝的問題。

我以前遇到過這個問題,但是通過將 function 之外的變量設置為 function 的 output 來很容易地解決了這個問題。

def create_df():
    data = {'state': ['Ohio','Ohio','Ohio','Nevada','Nevada'],
           'year': [2000,2001,2002,2001,2002],
           'pop': [1.5,1.7,3.6,2.4,2.9]}
    df = pd.DataFrame(data)
    return df

df = create_df()

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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