Pandas Multiindex 从索引的第一个条目获取值

Eul*_*sel 2 python multi-index pandas

我有以下多索引数据框:

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)


>> df
               runtime  value1  value2
File   no               
A      0    0     0       12      34
            1     1       13      34
            2     2       23      34
       1    3     6       23      38
            4     7       22      38
B      0    5     17      15      35
            6     18      17      35
C      0    7     34      23      32
            8     35      21      32
Run Code Online (Sandbox Code Playgroud)

我想得到的只是带有新文件和不同数字的每个条目的第一个值

A 0 34
A 1 38
B 0 35
C 0 32
Run Code Online (Sandbox Code Playgroud)

我能找到的最相似的问题

仅知道结果测量计数的重新采样熊猫数据框

熊猫中基于多索引的索引

在 Pandas MultiIndex DataFrame 中选择行

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

idx = pd.IndexSlice
df.loc[idx[:,0],:]
Run Code Online (Sandbox Code Playgroud)

例如,可以过滤该0值,但仍会返回数据帧的整个其余部分。

多索引甚至是手头任务的正确工具吗?如何解决这个问题?

jez*_*ael 6

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

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
Run Code Online (Sandbox Code Playgroud)

如果需要一列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
Run Code Online (Sandbox Code Playgroud)

另一个想法是删除3rd的水平DataFrame.reset_index,并通过过滤Index.get_level_valuesboolean 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
Run Code Online (Sandbox Code Playgroud)