我有一个数据集,我想选择仅提交日期大于“ 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
答案 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
以确保它是一个简单的清单。