如何将变量分配给函数内的合并Pandas数据帧

时间:2017-10-13 22:52:39

标签: pandas outer-join pass-by-value

我希望修改传入此函数的数据框。

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()之类的东西,但这只会让你做左连接。

2 个答案:

答案 0 :(得分: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

答案 1 :(得分: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