Python 如果列没有';不存在

Python 如果列没有';不存在,python,pandas,dataframe,Python,Pandas,Dataframe,假设给我一个pandas数据框,我想确保我有一些列存在,以及一些默认值,如果它们不存在,我可以将它们设置为默认值。我可以做到以下几点: 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] =

假设给我一个pandas数据框,我想确保我有一些列存在,以及一些默认值,如果它们不存在,我可以将它们设置为默认值。我可以做到以下几点:

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())

使用
分配的两种方法

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

这产生了与上面的
join
语法相同的结果,所以很遗憾,这不起作用。对我来说,这似乎是“正确”的方法——如果你回答这个问题,我会接受。对于大数据帧,它们的运行时间似乎也差不多。