选择DataFrame行:为什么结果用NaN值填充?

时间:2018-11-20 19:31:31

标签: python pandas dataframe

我有一个数据集,我想选择仅提交日期大于“ 2018/11/14 01:26 PM”的数据。

以下是我到目前为止的代码,但是数据集中的所有其他列都填充了nan值。我究竟做错了什么?

d = datetime.strptime('2018-11-14 01:26PM', '%Y-%m-%d %H:%M%p')
data[data['submission_date'] > d]

以下数据示例:

 ID    Name   submission_date  
 12    Mike   2018-11-14 01:26PM
 13    Mark   2018-11-14 02:00PM
 14    Taylor 2018-11-14 03:26PM
 14    Taylor 2018-11-15 03:26PM

1 个答案:

答案 0 :(得分:1)

我对pandas几乎一无所知,但是通过将您的问题作为学习练习,我发现了以下模式。使用平面列表初始化data.columns并创建一个Index对象时,一切都很好:

data = pandas.DataFrame( numpy.random.randn( 5, 2 ) )
data.columns=[ 'one', 'two' ]
print( data )

# Output:
#         one       two
# 0 -1.242567  0.430084
# 1 -1.125710 -0.342616
# 2 -0.514284  0.479382
# 3  0.108649 -0.789272
# 4  1.489155  0.842427

criterion = data[ 'one' ] > 0    # NB: criterion.shape is (5,): it is one-dimensional
print( data[ criterion ] )

# Output:
#         one       two
# 3  0.108649 -0.789272
# 4  1.489155  0.842427

但是,如果我更改列结构的维数(创建MultiIndex),则可以重新创建您描述的NaN综合症:

data.columns = [ [ 'one', 'two' ] ]   # note the double-nesting
print(data)  # it "looks" identical to how it did before...

# Output:
#         one       two
# 0 -1.242567  0.430084
# 1 -1.125710 -0.342616
# 2 -0.514284  0.479382
# 3  0.108649 -0.789272
# 4  1.489155  0.842427

criterion = data[ 'one' ] > 0   # but this criterion.shape is now (5,1): it's two-dimensional...
print( data[ criterion ] )

# Output:
#         one two
# 0       NaN NaN
# 1       NaN NaN
# 2       NaN NaN
# 3  0.108649 NaN
# 4  1.489155 NaN

这取决于DataFrame的列结构的(表面上不可见的)详细信息。让我感到非常惊讶的是,在执行切片时没有任何警告或异常,而且我无法想象在任何情况下,NaN缠身的结果将是明智的预期结果。

无论如何,可以通过对用于索引数据的数组进行重塑来明显地避免该问题,使其形状再次为(5,)

print( data[ criterion.values.flatten() ] )    # back to sanity

# Output:
#         one       two
# 3  0.108649 -0.789272
# 4  1.489155  0.842427

但是,如果您不想利用现有列结构提供的任何特定MultiIndex行为,那么更优雅的解决方案(由您的注释表示)可能只是重新分配data.columns以确保它是一个简单的清单。