如何修改传递给函数的现有数据帧

时间:2018-01-20 18:29:19

标签: python python-3.x pandas

我试图修改传递给函数的相同数据框,但更改不可见

当我对函数外部的数据框应用更改时,实现了预期的结果

test_df = test_df.apply(lambda x: x.str.strip("\t") if x.dtype == "object" else x)

打印出唯一值 -

print ("{0}-->{1}".format(val,pd.unique(test_df[val])))

O / P -

htn-->['yes' 'no']   
dm-->['yes' 'no' '  yes']  
cad-->['no' 'yes']
appet-->['good' 'poor']  
pe-->['no' 'yes']  
ane-->['no' 'yes']  
classification-->['ckd' 'notckd']

但是,如果我将Dataframe传递给函数并应用上述相同的函数,则不会观察到更改

def FillMissing(dataFrame):
    dataFrame = dataFrame.apply(lambda x: x.str.strip("\t") if x.dtype == "object" else x)


FillMissing(test_df)

O / P -

htn-->['yes' 'no']  
dm-->['yes' 'no' ' yes' '\tno' '\tyes']  
cad-->['no' 'yes' '\tno']  
appet-->['good' 'poor']  
pe-->['no' 'yes']  
ane-->['no' 'yes']  
classification-->['ckd' 'ckd\t' 'notckd']

如何在不将其声明为全局变量的情况下修改相同的现有数据框。

此外,我已尝试使用lambda函数的inplace标志,它不起作用

1 个答案:

答案 0 :(得分:1)

你所面临的是初学者pythonistas的典型困境。看看这个例子

a = 10
b = a
b = 11

b分配值a时,ba实际上指向为存储值10而创建的对象(< em>一切都是Python中的对象)。但是,当b分配了新值11时,a未分配值,因为它仍然指向旧值10。只有指针b已更改

所以当你这样做时

def FillMissing(dataFrame):
dataFrame = dataFrame.apply(lambda x: x.str.strip("\t") if x.dtype == "object" else x)


FillMissing(test_df)

思想test_dfdataFrame最初具有相同的值,dataFrame稍后会重新分配dataFrame.apply()操作的结果,但test_df会返回相同的值。解决方法是从方法返回新的dataFrame,可以单独使用,也可以根据需要返回元组。

一个很好的图表参考

http://foobarnbaz.com/2012/07/08/understanding-python-variables/

  

...但是在Python中,变量的工作方式更像标签,而不像之前看到的那样。当您在Python中进行赋值时,它会使用变量名称标记值....其他语言具有“变量”。 Python有'名字'