kwargs 不在函数内部传递键值参数,而是在函数外部传递
kwargs does not pass key-value parameters inside function, but does outside function
我想创建一个空 pandas.DataFrame
并使用 **kwargs
添加一些列。当我尝试在函数 make_new_data_frame
中填充 DataFrame
时,它仍然是空的(我尝试一一添加列,并且一次使用 kwargs)。但是,如果我从函数中 return kwargs
和 err_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
.
我想创建一个空 pandas.DataFrame
并使用 **kwargs
添加一些列。当我尝试在函数 make_new_data_frame
中填充 DataFrame
时,它仍然是空的(我尝试一一添加列,并且一次使用 kwargs)。但是,如果我从函数中 return kwargs
和 err_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
.