在Python3,您可以使用外地關鍵字:
def outer_method():
... do outer scope stuff here
df = pd.DataFrame(columns=['A','B','C','D'])
def recursive_method(arg):
nonlocal df
... do local stuff here
# func returns a data frame to be appended to empty data frame
results_df = func(args)
df = df.append(results_df, ignore_index=True)
return results
return df
但要注意,調用df.append
返回一個新的數據幀每次,因此需要複製所有舊的數據到新的數據幀。如果你在一個循環內進行N次,你最終會得到1 + 2 + 3 + ... + N = O(N^2)副本 - 對性能非常不利。
如果您不需要df
內recursive_method
比 追加其他任何目的,這是更好地附加到一個列表,然後構建 數據框(通過調用pd.concat
一次)recursive_method
完成後:
df = pd.DataFrame(columns=['A','B','C','D'])
data = [df]
def recursive_method(arg, data):
... do stuff here
# func returns a data frame to be appended to empty data frame
results_df = func(args)
data.append(df_join_out)
return results
recursive_method(arg, data)
df = pd.concat(data, ignore_index=True)
這是最好的解決辦法如果你需要做的就是收集數據內 recursive_method
並且可以在 recursive_method
完成後等待構建新的df
。
在Python2,如果必須使用df
內recursive_method
,那麼你可以通 df
作爲參數傳遞給recursive_method
,並返回df
太:
df = pd.DataFrame(columns=['A','B','C','D'])
def recursive_method(arg, df):
... do stuff here
results, df = recursive_method(arg, df)
# func returns a data frame to be appended to empty data frame
results_df = func(args)
df = df.append(results_df, ignore_index=True)
return results, df
results, df = recursive_method(arg, df)
但要注意,你會付出沉重的代價,進行上述O(N^2)複製 。
爲什麼DataFrames
不能
不應被附加到就地:
在一個數據幀中的相關數據被存儲在NumPy的陣列。 NumPy數組中的數據來自連續的內存塊。有時候,即使內存可用,也沒有足夠的空間將NumPy陣列調整爲較大的連續內存塊 - 想象一下陣列夾在 之間的其他數據結構。在這種情況下,爲了調整陣列大小,必須在其他地方分配新的更大的內存塊,並且必須將來自 原始陣列的所有數據複製到新塊。一般來說, 不能在原地完成。
DataFrames
確實有私有方法,_update_inplace
,可能是 用於將DataFrame的基礎數據重定向到新數據。這只是一個 僞操作,因爲新數據(認爲NumPy數組)必須首先分配爲 (所有伴隨複製)。所以使用_update_inplace
有 對它的兩次打擊:它使用私有方法(在理論上)在將來版本的熊貓中可能不會有 ,並且會導致O(N^2)拷貝懲罰。
In [231]: df = pd.DataFrame([[0,1,2]])
In [232]: df
Out[232]:
0 1 2
0 0 1 2
In [233]: df._update_inplace(df.append([[3,4,5]]))
In [234]: df
Out[234]:
0 1 2
0 0 1 2
0 3 4 5
對不起,你說'df = df.append(df_join_out,ignore_index = True)'不起作用? – EdChum
右側的'df'然後作爲未解決的參考給出。 –