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!
我创建了许多数据帧,所有数据帧都有不同的重叠日期时间索引。然后我将它们附加到彼此,并附加第二个索引,即“名称”列。
我尝试通过名称中的条目获取数据帧的一部分,但它说它没有进行词法排序。当我尝试 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!