kwargs不在函数内部传递键值参数,但在函数外部传递

时间:2017-06-07 03:43:57

标签: python python-3.x pandas kwargs

我想创建一个空pandas.DataFrame并使用**kwargs为其添加一些列。当我尝试在函数DataFrame中填充它时,make_new_data_frame仍为空(我尝试逐个添加列,并使用kwargs一次性添加列)。但是,如果我从函数返回kwargserr_df2,则操作正常(在jupyter笔记本中)。如何让这个在函数内部工作,为什么不呢? MWE低于

from pandas import DataFrame
def make_data_frame():
    df = DataFrame({'foo':[1,2,3], 'bar':[1.1,2.2,3.3]})
    return df
def make_new_data_frame():
    df = make_data_frame()
    err_df = DataFrame()
    kwargs = {}
    for c in df.columns:
        if c == 'foo':
            continue
        err_df.assign(**{c: df['foo'] - df[c]})
        kwargs[c] = df['foo'] - df[c]
    err_df2 = DataFrame()
    err_df2.assign(**kwargs)
    return err_df, err_df2, kwargs
err_df, err_df2, kwargs = make_new_data_frame()
print(err_df,'\n')
print(err_df2,'\n')
print(raw_data,'\n')
err_df2.assign(**kwargs)

输出:

Empty DataFrame
Columns: []
Index: [] 

Empty DataFrame
Columns: []
Index: [] 

{'bar': 0   -0.1
1   -0.2
2   -0.3
dtype: float64} 

Out[26]:
bar
0   -0.1
1   -0.2
2   -0.3

2 个答案:

答案 0 :(得分:1)

这来自assign docs:

  

将新列分配给DataFrame,返回一个新对象(副本),除了新的列之外还包含所有原始列。

所以你需要在函数中做这样的事情:

err_df2 = err_df2.assign(**kwargs)

答案 1 :(得分:1)

为了澄清您问题中的假设,数据框实际上在您的案例的两个内部和外部都是空的。它也不是你在函数之外做的事情。

assign不会更改数据框。 REPL环境增加了assign可能正在做的混乱,但事实并非如此。

当您在最后一行执行err_df2.assign(**kwargs)时,您看到的所谓“正确”输出只是在交互式会话中打印的assign产生的新副本。 err_df2本身没有改变。

因此,当您打印实际的err_df2数据框时 - 无论是创建“内部”还是“外部” - 您看到的是您初始化的空DataFrame(),而assign没有任何更改。< / p>