如果列不存在,则将默认值添加为列

时间:2017-09-24 18:57:26

标签: python pandas dataframe

假设我给了一个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())

1 个答案:

答案 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