错误和/或空字符串导致Pandas DataFrame.append结果不一致

时间:2016-02-19 01:27:11

标签: python pandas

我注意到将包含空字符串('')和/或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



案例1:

但是,如果我在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



案例2:

如果空字符串和False都是值,则pd.append()会更加不一致,同时返回NoneNaN个值:

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



案例3:

更改''和False的顺序会产生NoneNaN值的另一种组合:

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

1 个答案:

答案 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特质是根本原因。