Lexsorting Pandas 具有日期时间索引和字符串索引的多索引

Lexsorting Pandas Multi-Index with datetime index and string index

我创建了许多数据帧,所有数据帧都有不同的重叠日期时间索引。然后我将它们附加到彼此,并附加第二个索引,即“名称”列。

我尝试通过名称中的条目获取数据帧的一部分,但它说它没有进行词法排序。当我尝试 lexsort 时,它在名称列中的字符串上抛出错误,说它不是日期...

df0 = pd.read_csv("file.csv", index_col='date', parse_dates=True)
df1 = pd.read_csv("file2.csv", index_col='date', parse_dates=True)

stack = pd.concat([df0, df1] ,axis=0)
stack.set_index('name', append=True,inplace=True)

print(stack.loc[datetime(2015,5,1)])
print(stack.loc['AAA'])

日期上的 .loc 有效,returns 给定日期的所有名称和值,但字符串上的 .loc,在第二个索引 returns 中 UnsortedIndexError: 'MultiIndex slicing requires the index to be lexsorted: slicing on levels [0], lexsort depth 0'

当我根据我在此处阅读的内容尝试使用 stack.sort_index(inplace=True) 进行排序时,出现错误 ValueError: Unknown datetime string format, unable to parse: AAA

数据帧堆栈如下所示:

date       name       value
1/1/15     AAA         1
...        ...         ...
12/1/15    AAA         9
1/1/15     BBB         6
...        ...         ...
12/1/15    BBB         3

我希望能够 return AAA 的所有日期和值。我知道我可以将它作为单个索引保留,然后进行 groupby 或过滤,但我认为这是多索引的目的?

再次编辑以澄清 - 我想知道如何对第二个索引进行词法排序。我不确定为什么 pandas 期望它也是一个日期时间索引,我认为这就是它的含义。

编辑以添加 stack.head(),但如上所示。

                    value         
date       name
2015-01-02 AAA     164.71  
2015-01-05 AAA     163.00  
2015-01-06 AAA     160.82  
2015-01-07 AAA     159.90  
2015-01-08 AAA     160.65  

Edit3:当我使用 stack.sort_index(level = [1], inplace=True,axis=0)

对关卡名称进行排序时

我得到: pandas.errors.UnsortedIndexError: 'MultiIndex slicing requires the index to be lexsorted: slicing on levels [0], lexsort depth 0

您似乎在寻找 cross-section (xs):

df.xs('AAA', level='name', drop_level=False)

示例:

df = (pd.DataFrame({'value': {(Timestamp('2015-01-02 00:00:00'), 'AAA'): 164.71,
                              (Timestamp('2015-01-05 00:00:00'), 'AAA'): 163.0,
                              (Timestamp('2015-01-06 00:00:00'), 'AAA'): 160.82,
                              (Timestamp('2015-01-02 00:00:00'), 'BBB'): 159.9,
                              (Timestamp('2015-01-05 00:00:00'), 'BBB'): 160.65}})
        .rename_axis(['date', 'name'])
        .sort_index(level=1)
     )

df.xs('AAA', level='name', drop_level=False)

                  value
date       name        
2015-01-02 AAA   164.71
2015-01-05 AAA   163.00
2015-01-06 AAA   160.82

或者,使用 IndexSlice:

idx = pd.IndexSlice
df.loc[idx[:, 'AAA'], :]

我不喜欢这个解决方案,但经过大量修改后我得出了:

stack.loc[(slice(None),'AAA'),:]

如果有其他方法或mozway的解决方案请回复。

编辑 -- 我所做的各种问题 --- Unknown datetime string format, unable to parse: AAA 是因为我试图查找 AAA 而没有指定它是索引级别 [1]。与排序无关。排序效果很好。

回想起来,我想我希望的解决方案是 stack.loc[:,'AAA'] 但事实并非如此。已经为此浪费了太多时间,希望它可以节省其他人的精力。谢谢 Mozway!