簡體   English   中英

使用級別獲取多索引Pandas DataFrame的最小索引

[英]Get index of the minimum of multi-index Pandas DataFrame using level

我有一個熊貓數據幀multiindexed ,並希望找到在每個級別上的行的子集某列的最小值,並獲得這些行的全部內容。

import pandas as pd

idx = pd.MultiIndex.from_product([['v1', 'v2'],
                                  ['record' + str(i) for i in range(1, 7)]])

df = pd.DataFrame([[2., 114], [2., 1140],
                   [3., 114], [3., 1140],
                   [5., 114], [5., 1140],
                   [2., 114], [2., 1140],
                   [3., 114], [3., 1140],
                   [5., 114], [5., 1140]],
                  columns=['col1', 'col2'],
                  index=idx)

我的結構:

                 col1  col2
level1 level2
v1     record1    2.0   114
       record2    2.0  1140
       record3    3.0   114
       record4    3.0  1140
       record5    5.0   114
       record6    5.0  1140
v2     record1    2.0   114
       record2    2.0  1140
       record3    3.0   114
       record4    3.0  1140
       record5    5.0   114
       record6    5.0  1140

示例所需的輸出我想要col1 == 5的另一列的最小值:

                 col1  col2
level1 level2
v1     record5    5.0   114
v2     record5    5.0   114

我知道我可以使用比較語句獲取行的子集。

df.ix[df['col1'] == 5]

而且我也知道,我可以從各級該子集內獲取某列的最小值

df['col2'][df['col1'] == 5].min(level='level1')

如果我想指定級別,那么我可以在特定級別上獲得1行的索引

df.ix['v1', pay_up_file.ix['v1']['col2'][(df.ix['v1']['col1'] == 5)].idxmin()]

但我無法弄清楚是否有一種有效的方法從各個層面獲取索引

似乎沒有一種方法可用於此:

df['col2'][df['col1'] == 5].idxmin(level='level1')

我可以用這個得到我想要的東西:

df.ix[
  (df['col1'] == 5) & 
  (df['col2'].isin(df['col2'][df['col1'] == 5].min(level='level1').values))
]

但是對於Pandas其他一切,是否有更好的方法來獲得我的輸出?

這應該工作:

df.loc[df.loc[df.col1 == 5.].groupby(level=0).col2.idxmin()]

            col1  col2
v1 record5   5.0   114
v2 record5   5.0   114

注意

我正在使用你認為應該的idxmin 但背景很重要。 我在groupby(level=0).col2.idxmin()它,它的行為與你認為的col2.idxmin(level=...)

>>> (df[df.col1 == 5]
     .groupby(level=0, as_index=False).col2
     .apply(lambda group: group.nsmallest(1))
0  v1  record5    114
1  v2  record5    114
dtype: int64

要么...

>>> df[df.col1 == 5].groupby(level=0).col2.nsmallest(1)
v1  v1  record5    114
v2  v2  record5    114
dtype: int64

但我不確定為什么第一級顯示兩次(即'v1''v1'......)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM