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

kwargs does not pass key-value parameters inside function, but does outside function

我想创建一个空 pandas.DataFrame 并使用 **kwargs 添加一些列。当我尝试在函数 make_new_data_frame 中填充 DataFrame 时,它仍然是空的(我尝试一一添加列,并且一次使用 kwargs)。但是,如果我从函数中 return 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

这来自 assign 文档:

Assign new columns to a DataFrame, returning a new object (a copy) with all the original columns in addition to the new ones.

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

err_df2 = err_df2.assign(**kwargs)

为了澄清你问题中的一个假设,数据框在你的两个案例中实际上是空的,内部和外部。它也没有在函数之外执行您期望的操作。

assign 不会就地更改数据框。 REPL 环境增加了混淆,即 assign 可以这样做,但事实并非如此。

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

因此,当您打印实际的 err_df2 数据帧时——无论是创建 "inside" 还是 "outside"——您看到的是您初始化的空 DataFrame(),没有任何来自 assign.