Pandas Multiindex从索引的第一项获取值

时间:2019-07-17 13:09:24

标签: python pandas multi-index

我有以下多索引数据框:

    from io import StringIO
    import pandas as pd
    datastring = StringIO("""File,no,runtime,value1,value2
        A,0, 0,12,34
        A,0, 1,13,34
        A,0, 2,23,34
        A,1, 6,23,38
        A,1, 7,22,38
        B,0,17,15,35
        B,0,18,17,35
        C,0,34,23,32
        C,0,35,21,32
        """)    
    df = pd.read_csv(datastring, sep=',')
    df.set_index(['File','no',df.index], inplace=True)

我想要得到的只是每个条目的前一个值,其中包含一个新文件和一个不同的编号

A 0 34
A 1 38
B 0 35
C 0 32

我在哪里可以找到最相似的问题

Resample pandas dataframe only knowing result measurement count

MultiIndex-based indexing in pandas

Select rows in pandas MultiIndex DataFrame

但是我无法从他们那里构造一个解决方案。我得到的最好的结果是ix操作,但是由于从技术上讲这些值仍然存在(只是没有显示),结果是

idx = pd.IndexSlice
df.loc[idx[:,0],:]
例如,

可以过滤0值,但仍将返回数据帧的其余部分。

多索引甚至是解决当前任务的正确工具吗?该如何解决?

2 个答案:

答案 0 :(得分:0)

MultiIndex的第一级和第二级使用GroupBy.first

s = df.groupby(level=[0,1])['value2'].first()
print (s)
File  no
A     0     34
      1     38
B     0     35
C     0     32
Name: value2, dtype: int64

如果需要一列DataFrame,请使用一个元素list

df1 = df.groupby(level=[0,1])[['value2']].first()
print (df1)
         value2
File no        
A    0       34
     1       38
B    0       35
C    0       32

另一种想法是通过DataFrame.reset_index删除3rd级别,并使用Index.get_level_values通过boolean indexing过滤:

df2 = df.reset_index(level=2, drop=True)
s = df2.loc[~df2.index.duplicated(), 'value2']
print (s)
File  no
A     0     34
      1     38
B     0     35
C     0     32
Name: value2, dtype: int64

答案 1 :(得分:0)

为了完整起见,我想添加另一种方法(没有jezrael的答复者是找不到的)。

s = df.groupby(level=[0,1])['value2'].nth(0)

这可以概括为查找任何内容,而不仅仅是找到第一个条目

t = df.groupby(level=[0,1])['value1'].nth(1)

请注意,如前者一样,选择从value2更改为value1nth(0)nth(1)的结果将是相同的。

熊猫文档链接:https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.core.groupby.GroupBy.nth.html