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