假设我给了一个pandas DataFrame,我想确保我有一些列,以及一些默认值,如果他们不在那里我可以设置它们。我可以做到以下几点:
def add_default_values_and_print(df):
out_df = df.copy()
def_values = { 'a':1, 'b':0 }
for k, v in def_values.iteritems():
if k not in df:
out_df[k] = v
print(out_df.to_csv())
这看起来很笨拙,感觉应该有更好的,更多的" pandas
"这样做的方式。如果我将默认值放在他们自己的框架中并进行连接,那么第一行将具有默认值,其余的将具有NaN:
In [1]: import pandas as pd
In [2]: df = pd.DataFrame([[0,1], [2,3]])
In [3]: defaults_df = pd.DataFrame({ 'a':[1], 'b':[0] })
In [4]: df.join(defaults_df, how='outer')
Out[4]:
0 1 a b
0 0 1 1.0 0.0
1 2 3 NaN NaN
这不是预期的输出,但我觉得这样的事情应该是可行的。
有什么建议吗?
编辑:从@Zero的评论中,以下内容应该有效:
def add_default_values_and_print(df):
def_values = { 'a':1, 'b':0 }
missing_values = {
k:v for k,v in def_values.iteritems()
if k not in df
}
print(df.assign(**missing_values).to_csv())
答案 0 :(得分:1)
使用assign
In [3405]: def_values = {'a':1, 'b':0}
In [3406]: df.assign(**{k: def_values[k] for k in def_values if k not in df})
Out[3406]:
0 1 a b
0 0 1 1 0
1 2 3 1 0
In [3407]: def_s = pd.Series(def_values)
In [3408]: def_s
Out[3408]:
a 1
b 0
dtype: int64
In [3409]: df.assign(**def_s[~def_s.index.isin(df)])
Out[3409]:
0 1 a b
0 0 1 1 0
1 2 3 1 0