2017-10-13 10 views
2

この関数に渡されるデータフレームを変更したいと思います。ファンクション内でマージされたPandasデータフレームに変数を割り当てる方法

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

これは間違いなく機能します。 [this post](https://stackoverflow.com/questions/38895768/python-pandas-dataframe-is-it-pass-by-value-or-pass-by-reference)によると、グローバル変数を使用すると、変更が発生した場所を追跡することは困難ですが、これは私が見てきた最良の解決策です。 – haudarren

1

Pythonは値渡ししません!
注:これはあなたの問題は、あなたが名前dfのローカルバージョンを命名されていることである
一般PROOF

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 

で悪いコーディングプラクティスです。あなたは何とかデータフレーム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 
関連する問題