Python 如果列没有';不存在
假设给我一个pandas数据框,我想确保我有一些列存在,以及一些默认值,如果它们不存在,我可以将它们设置为默认值。我可以做到以下几点: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] =
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
语法相同的结果,所以很遗憾,这不起作用。对我来说,这似乎是“正确”的方法——如果你回答这个问题,我会接受。对于大数据帧,它们的运行时间似乎也差不多。