我有以下多索引数据框:
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
值,但仍将返回数据帧的其余部分。
多索引甚至是解决当前任务的正确工具吗?该如何解决?
答案 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
更改为value1
,nth(0)
和nth(1)
的结果将是相同的。
熊猫文档链接:https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.core.groupby.GroupBy.nth.html