2017-10-13 17 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) 

그러나, 호출 수신자 func()은 원래 빈 dataframe을 가리키는 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

파이썬이 값에 의해 전달하지 않습니다!
참고 : 일반
증거에
이 나쁜 코딩 연습

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