我正在从一项调查中获得一个相当复杂的数据集的Pandas表示形式。到目前为止,似乎具有多索引的一维变量序列是存储和处理这些数据的最佳选择。具有可变长度多指数的pandas数据框用NaN替换值
每个变量名称由一个“路径”组成,以唯一标识该特定响应。这些路径长度各不相同。我试图弄清楚,如果我误解了分级索引应该如何工作,或者如果我遇到了一个bug。看起来Pandas在将它们连接到数据集时将“较短的索引”填充到最大长度,并在此过程中破坏该值。
例如,测试失败:
def test_dataframe_construction1(self):
case1 = pd.Series(True, pd.MultiIndex.from_tuples([
('a1', 'b1', 'c1'),
('a2', 'b2', 'c2', 'd1', 'e1'),
]))
case2 = pd.Series(True, pd.MultiIndex.from_tuples([
('a3', 'b3', 'c3'),
('a4', 'b4', 'c4', 'd2', 'e2'),
]))
df = pd.DataFrame({
'case1': case1,
'case2': case2
})
logger.debug(df)
self.assertEquals(df['case1'].loc['a1'].any(), True)
,并打印这样的:
a1 b1 c1 nan nan NaN NaN
a2 b2 c2 d1 e1 True NaN
a3 b3 c3 nan nan NaN NaN
a4 b4 c4 d2 e2 NaN True
有趣的是,填充了空字符串,而不是NaN的“短”指数导致的行为我会预计:
def test_dataframe_construction2(self):
case1 = pd.Series(True, pd.MultiIndex.from_tuples([
('a1', 'b1', 'c1', '', ''),
('a2', 'b2', 'c2', 'd1', 'e1'),
]))
case2 = pd.Series(True, pd.MultiIndex.from_tuples([
('a3', 'b3', 'c3', '', ''),
('a4', 'b4', 'c4', 'd2', 'e2'),
]))
df = pd.DataFrame({
'case1': case1,
'case2': case2
})
logger.debug(df)
self.assertEquals(df['case1'].loc['a1'].any(), True)
并打印此:
case1 case2
a1 b1 c1 True NaN
a2 b2 c2 d1 e1 True NaN
a3 b3 c3 NaN True
a4 b4 c4 d2 e2 NaN True
我在这里错过了什么?谢谢!
MultiIndex不能有不同长度的索引。每个索引项目必须具有相同的长度。如果你想用NaN之外的东西来填充它们,你必须自己做。 – BrenBarn 2013-05-11 22:24:31
问题是用NaN填充它们也会破坏价值。用NaN手工填充它们也具有相同的结果。 – easel 2013-05-11 23:59:15