【问题标题】:kwargs does not pass key-value parameters inside function, but does outside functionkwargs 不在函数内部传递键值参数,而是在函数外部传递
【发布时间】:2017-06-07 13:04:52
【问题描述】:

我想创建一个空的pandas.DataFrame 并使用**kwargs 添加一些列。当我尝试将DataFrame 填充到函数make_new_data_frame 中时,DataFrame 仍然为空(我尝试一一添加列,并且一次使用 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

【问题讨论】:

    标签: python python-3.x pandas keyword-argument


    【解决方案1】:

    这是来自assign docs:

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

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

    err_df2 = err_df2.assign(**kwargs)
    

    【讨论】:

      【解决方案2】:

      为了澄清您问题中的一个假设,数据框在您的 both 案例中实际上是空的,无论是内部还是外部。它也没有在函数之外做你期望的事情。

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

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

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

      【讨论】:

        猜你喜欢
        • 2021-09-21
        • 1970-01-01
        • 2018-09-26
        • 2015-02-17
        • 2015-10-05
        • 2023-03-07
        • 1970-01-01
        • 2014-03-05
        • 1970-01-01
        相关资源
        最近更新 更多