2017-10-13 100 views
2

我想傳遞到此函數的數據幀進行修改。如何分配變量合併熊貓數據框內功能

def func(df): 
    left_df = pd.DataFrame([[1, 2], [3, 4]], columns=['A', 'B']) 
    right_df = pd.DataFrame([[5, 6], [7, 8]], columns=['C', 'D']) 
    df = pd.merge(left_df, right_df, how='outer', left_index=True, right_index=True) 
    print("df is now a merged dataframe!") 

test = pd.DataFrame() 
func(test) 

然而,因爲Python經過值,被叫方func()得到的df副本指向原來的空數據幀。當它被分配給合併的數據幀時,它將創建一個新對象,由pd.merge()返回,並將df指向此新對象。但是,test未更改,並且繼續指向原始空白數據框。

我們怎樣才能在func()就地合併所以test實際上是變了?我喜歡pandas.DataFrame.update()之類的東西,但這隻能讓你做左連接。

回答

1

IIUC,這樣的事情?

def func(df): 
    left_df = pd.DataFrame([[1, 2], [3, 4]], columns=['A', 'B']) 
    right_df = pd.DataFrame([[5, 6], [7, 8]], columns=['C', 'D']) 
    df = pd.merge(left_df, right_df, how='outer', left_index=True, right_index=True) 
    print("df is now a merged dataframe!") 
    global test 
    test = df 

test = pd.DataFrame() 
func(test) 
print(test) 

輸出:

df is now a merged dataframe! 
    A B C D 
0 1 2 5 6 
1 3 4 7 8 
+0

這絕對有效!根據[這篇文章](https://stackoverflow.com/questions/38895768/python-pandas-dataframe-is-it-pass-by-value-or-pass-by-reference),使用全局變量可以使它很難跟蹤發生的變化,但這是我見過的最好的解決方案。 – haudarren

1

Python不按值傳遞!
注:這是不好的編程習慣一般
證明

test = pd.DataFrame([[1, 2], [3, 4]]) 

def func(df): 
    df.loc[:] = df * 2 

print(test) 
func(test) 
print(test) 

    0 1 
0 1 2 
1 3 4 

    0 1 
0 2 4 
1 6 8 

您的問題是,你命名的名稱df的本地版本。您需要以某種方式更改數據幀inplace

test = pd.DataFrame([[1, 2], [3, 4]], columns=list('AB')) 

def func(df): 
    df.loc[:, 'C'] = 9 

print(test) 
func(test) 
print(test) 

    A B 
0 1 2 
1 3 4 

    A B C 
0 1 2 9 
1 3 4 9