我想根据列名而不是索引来有条件地对多级索引数据进行切片。例如,我有以下多级索引数据框:
203 204 205
TIME VALUE TIME VALUE TIME VALUE
0 1 bar 1.0 LH2 10.0 dog
1 2 baz 2.0 LOX 11.0 cat
2 3 foo 3.0 CH4 12.0 pig
3 4 qux NaN NaN 13.0 rat
4 5 qaz NaN NaN NaN NaN
5 6 qoo NaN NaN NaN NaN
我基本上有测量数据(203、204等)和时间以及值,使用不同的采样率记录。因此,行数总是不同的。我将所有数据放入单个MultiIndex中,因为它可以包含可变数量的行。
如果时间大于3,我想选择所有数据。预期输出如下:
203 204 205
TIME VALUE TIME VALUE TIME VALUE
0 4 qux NaN NaN 10.0 dog
1 5 qaz NaN NaN 11.0 cat
2 6 qoo NaN NaN 12.0 pig
3 NaN NaN NaN NaN 13.0 rat
4 NaN NaN NaN NaN NaN NaN
5 NaN NaN NaN NaN NaN NaN
我尝试使用查询方法,但它只适用于索引而不是列名。我不想转置数据框以使用查询。我还尝试过使用loc,但似乎找不到我想要的内容。我甚至尝试使用xs,但我不认为我可以添加条件切片。
我在SO上找到了这个问题,但它不包括条件切片: Selecting columns from pandas MultiIndex
以下是我一直在使用的代码进行测试:
import pandas as pd
import numpy as np
d1 = {'TIME': [1,2,3,4,5,6], 'VALUE': ['bar', 'baz', 'foo', 'qux', 'qaz', 'qoo']}
df1 = pd.DataFrame(data=d1)
d2 = {'TIME': [1,2,3], 'VALUE': ['LH2', 'LOX', 'CH4']}
df2 = pd.DataFrame(data=d2)
d3 = {'TIME': [10,11,12,13], 'VALUE': ['dog', 'cat', 'pig', 'rat']}
df3 = pd.DataFrame(data=d3)
df_list = [df1, df2, df3]
pids = [203, 204, 205]
df_multi = pd.concat(df_list, axis=1, keys=list(zip(pids)))
print(df_multi)
# Slice all time columns
ALL = slice(None)
df_multi_2 = df_multi.loc[ALL, (ALL, 'TIME')]
print(df_multi_2)
# Condition based slicing - does not work
ALL = slice(None)
df_multi_3 = df_multi.loc[ALL, df_multi.loc[ALL,(ALL,'TIME')] > 3]
print(df_multi_3)