为什么 .loc 不能正确反转切片?

Why doesn't .loc reverse slice correctly?

提问人:Stxffan 提问时间:12/25/2022 更新时间:12/25/2022 访问量:62

问:

根据我的理解,有两种方法可以在 pandas 中对数据帧进行子集:

a) b)df['columns']['rows']df.loc['rows', 'columns']

我正在遵循一个引导式案例研究,其中的指令是选择数据帧中列的前 n 行和后 n 行。该解决方案使用了方法 A,而我尝试了方法 B。

我的方法不起作用,我一辈子都无法弄清楚原因。

我创建了一个简化版本的 DataFrame...

male = [6, 14, 12, 13, 21, 14, 14, 14, 14, 18]
female = [9, 11, 6, 10, 11, 13, 12, 11, 9, 11]

df = pd.DataFrame({'Male': male,
                    'Female': female}, 
                    index = np.arange(1, 11))
df['Mean'] = df[['Male', 'Female']].mean(axis = 1).round(1)
df

选择前两行,适用于方法 a 和 b

print('Method A: \n', df['Mean'][:2])
print('Method B: \n', df.loc[:2, 'Mean'])
Method A: 
1     7.5
2    12.5

Method B: 
1     7.5
2    12.5

但不是选择最后 2 行,它的工作方式不同。方法 A 按应有的方式返回最后两行。 方法 B (.loc) 没有,它返回整个数据帧。为什么会这样,我该如何解决?

print('Method A: \n', df['Mean'][-2:])
print('Method B: \n', df.loc[-2:, 'Mean'])
Method A: 
9     11.5
10    14.5

Method B: 
1      7.5
2     12.5
3      9.0
4     11.5
5     16.0
6     13.5
7     13.0
8     12.5
9     11.5
10    14.5
Pandas DataFrame 索引 切片

评论

0赞 MatBailie 12/25/2022
可能是因为如果在切片中使用整数索引位置,则应使用。 使用标签,而不是整数位置。(没有索引标签 -2 iloc 和 loc 有何不同?ilocloc

答:

0赞 Quinten 12/25/2022 #1

您可以使用来获取最后两行的索引,即 9 和 10,而不仅仅是 .下面是一些可重现的代码:.index[-2:]-2:

male = [6, 14, 12, 13, 21, 14, 14, 14, 14, 18]
female = [9, 11, 6, 10, 11, 13, 12, 11, 9, 11]

df = pd.DataFrame({'Male': male,
                    'Female': female}, 
                    index = np.arange(1, 11))
df['Mean'] = df[['Male', 'Female']].mean(axis = 1).round(1)

print('Method B: \n', df.loc[df.index[-2:], 'Mean'])

输出:

Method B: 
9     11.5
10    14.5
Name: Mean, dtype: float64

正如你所看到的,它返回了数据帧的最后两行。

0赞 The Lord 12/25/2022 #2

您也可以获得 和 方法,如下所示:iloctail

df['Mean'][-2:]
df['Mean'].iloc[-2:]
df['Mean'].tail(2)

我们通常不用于此。 或其他方法更容易使用。但如果你想使用它,它可以是这样的:lociloc

df.loc[df.index[-2:],'Mean']