我注意到将包含空字符串('')和/或False值的Series传递给DataFrame.append()会导致它不一致地处理None
值。
如果我做错了和/或不推荐,有人可以告诉我吗?也许有可用的解决方法?
df = pd.DataFrame(columns=('col1','col2', 'col3', 'col4', 'col5', 'col6'))
ser = pd.Series({'col1' : None,
'col2' : None,
'col3' : None,
'col4' : None,
'col5' : None})
sum_df = df.append(ser, ignore_index=True)
print("First append = \n%s\n" % sum_df)
sum_df = sum_df.append(ser, ignore_index=True)
print("Second append = \n%s\n" % sum_df)
以下是我的结果,我觉得并不令人惊讶:
First append =
col1 col2 col3 col4 col5 col6
0 NaN NaN NaN NaN NaN NaN
Second append =
col1 col2 col3 col4 col5 col6
0 NaN NaN NaN NaN NaN NaN
1 NaN NaN NaN NaN NaN NaN
但是,如果我在ser
中使用空字符串(''),则结果会发生变化。
ser = pd.Series({'col1' : None,
'col2' : None,
'col3' : '',
'col4' : None,
'col5' : None,
'col6' : None})
而不是Nan
,pd.append()将返回None
值。:
First append =
col1 col2 col3 col4 col5 col6
0 None None None None None
Second append =
col1 col2 col3 col4 col5 col6
0 None None None None None
1 None None None None None
如果空字符串和False都是值,则pd.append()会更加不一致,同时返回None
和NaN
个值:
ser = pd.Series({'col1' : None,
'col2' : None,
'col3' : '',
'col4' : False,
'col5' : None,
'col6' : None})
First append =
col1 col2 col3 col4 col5 col6
0 None None False None None
Second append =
col1 col2 col3 col4 col5 col6
0 None None False NaN NaN
1 None None False None None
更改''和False的顺序会产生None
和NaN
值的另一种组合:
ser = pd.Series({'col1' : None,
'col2' : None,
'col3' : False,
'col4' : '',
'col5' : None,
'col6' : None})
First append =
col1 col2 col3 col4 col5 col6
0 None None False None None
Second append =
col1 col2 col3 col4 col5 col6
0 NaN NaN False None None
1 None None False None None
Pandas.__version__ = 0.17.1
Python --version = 2.7.10
答案 0 :(得分:1)
Per Working with Missing Data,在Pandas中表示缺失值的规范方法是np.NaN
(出于性能原因)。使用np.NaN
代替None
s可获得您期望的行为。但是,添加具有未知值的行的最佳方法如下:
ser = pd.Series({'col3' : ''})
将此ser
添加到数据框中会产生
Second append =
col1 col2 col3 col4 col5 col6
0 NaN NaN NaN NaN NaN
1 NaN NaN NaN NaN NaN
通过不定义其他列的内容,Series.reindex()
函数会自动为您填写NaN
。它也更干净!
至于你为什么在你的例子中看到奇怪的结果,我会猜测(None == None) == True
和(np.NaN == np.NaN) == False
特质是根本原因。