我有一个函数,它以dataframe作为参数,在处理这个dataframe时,它调用另一个函数,将同一个dataframe的一个片段作为参数传递给辅助函数。在
所有更改都在适当的位置完成,因此不会返回任何内容(因为数据帧的大小)。在
但是,这个辅助函数引发SettingWithCopyWarning,因为它不再处理原始数据帧。在
下面是一个例子:import pandas as pd
import numpy as np
df = pd.DataFrame(np.arange(9).reshape(3,3), columns=list('abc'))
print df
def a(df):
if df.is_copy:
print 'a got a copy'
df['a'] = 'a'
def b(df):
if df.is_copy:
print 'b got a copy'
print df.is_copy
df.loc[:,'b'] = 'b'
def c(df):
a(df)
b(df.loc[0:1,:])
if df.is_copy:
print 'c got a copy'
df.loc[0:1,'c'] = 'c'
def d(df):
new_df = df.loc[0:1].copy(deep=True)
b(new_df)
df.update(new_df)
del new_df
c(df)
df
结果:
^{pr2}$
我知道其中一个选项是从原始片段创建一个新的数据帧,并将其传递给b,然后df.update(new_df)和{}表明它是有效的:d(df)
df
产生所需的输出:a b c
0 a b c
1 a b c
2 a 7 8
但是有没有一种方法可以在不创建新的数据帧和引发SettingWithCopyWarning的情况下处理这个问题呢。在
另一个复杂的情况是,从c内部调用b有时可能只是简单的b(df),所以切片是可选的。在
谢谢。在