假设给了我一个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())
最佳答案
使用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
关于python - 如果不存在列,则将默认值添加为列,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/46393729/