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

Posted

技术标签:

【中文标题】如何在函数内将变量分配给合并的 Pandas 数据框【英文标题】:How to assign variable to merged Pandas dataframe within function 【发布时间】:2018-03-26 03:04:11 【问题描述】:

我想修改传入这个函数的数据框。

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

【讨论】:

这绝对有效!根据this post 的说法,使用全局变量可能很难跟踪发生更改的位置,但这是我见过的最好的解决方案。【参考方案2】:

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

【讨论】:

以上是关于如何在函数内将变量分配给合并的 Pandas 数据框的主要内容,如果未能解决你的问题,请参考以下文章

如何将 python 对象(如字典)分配给 pandas 列

挑战SQL:图解pandas的数据合并merge函数

数据分析 -- Pandas③

pandas数据合并之append与concat

pandas设置excel单元格日期类型分秒

17、pandas的merge合并函数