下面的代码说明了我的问题:
In [2]: idx = pd.date_range('1/1/2011', periods=5)
In [3]: idx
Out[3]:
DatetimeIndex(['2011-01-01', '2011-01-02', '2011-01-03', '2011-01-04', '2011-01-05'],
dtype='datetime64[ns]', freq='D')
In [4]: midx = pd.MultiIndex.from_product([['100', '200'], idx])
In [5]: midx
Out[5]: MultiIndex(levels=[['100', '200'],
[2011-01-01 00:00:00, 2011-01-02 00:00:00, 2011-01-03 00:00:00, 2011-01-04 00:00:00, 2011-01-05 00:00:00]],
labels=[[0, 0, 0, 0, 0, 1, 1, 1, 1, 1], [0, 1, 2, 3, 4, 0, 1, 2, 3, 4]])
In [6]: test_data = pd.DataFrame(
2*[[1, 2], [NaN, 3], [4, NaN], [5, 6], [7, 8]],
index=midx, columns=['quant1', 'quant2']
)
In [7]: test_data
Out[7]:
quant1 quant2
100 2011-01-01 1.0 2.0
2011-01-02 NaN 3.0
2011-01-03 4.0 NaN
2011-01-04 5.0 6.0
2011-01-05 7.0 8.0
200 2011-01-01 1.0 2.0
2011-01-02 NaN 3.0
2011-01-03 4.0 NaN
2011-01-04 5.0 6.0
2011-01-05 7.0 8.0
In [8]: new_data = pd.DataFrame([11, 12, 13, 14, 15], index=idx, columns=['quant1'])
In [9]: new_data
Out[9]:
quant1
2011-01-01 11
2011-01-02 12
2011-01-03 13
2011-01-04 14
2011-01-05 15
In [10]: test_data.loc['100', 'quant1'] = new_data
In [11]: test_data
Out[11]:
quant1 quant2
100 2011-01-01 NaN 2.0
2011-01-02 NaN 3.0
2011-01-03 NaN NaN
2011-01-04 NaN 6.0
2011-01-05 NaN 8.0
200 2011-01-01 1.0 2.0
2011-01-02 NaN 3.0
2011-01-03 4.0 NaN
2011-01-04 5.0 6.0
2011-01-05 7.0 8.0
为什么['100', 'quant1']
数据段用NaN
而不是来自new_data
的数字填充
我发现使用
test_data.loc['100', 'quant1'] = new_data.values
确实有效,但我想了解是什么使得Pandas
这样做的。子切片具有与新数据相同的维度,甚至相同的索引,因此,尽管我确实怀疑这与索引/对齐有关,但我并不真正理解如何或为什么-我的期望是,只要您使用与所分配的索引完全相同的索引,就可以正常工作
因为Pandas将接收数据帧和提供新数据的序列的索引对齐。当它这样做时,它无法找到它正在寻找的相关索引
test_data.loc['100', 'quant2']
的索引项为('100', '2011-01-01')
,而new_data
的索引项为'2011-01-01'
。这些不一样解决1
使用
values
属性并跳过尝试对齐的熊猫解决2
使用
pd.concat
添加索引级别相关问题 更多 >
编程相关推荐