为什么我的 pandas 数据框的选择形状是错误的

Why does the shape of the selection of my pandas dataframe is wrong

我有一个名为 df 的 pandas DataFrame,其中 df.shape(53, 80),其中索引和列都是 int.

如果我 select 这样第一行,我得到:

df.loc[0].shape
(80,)

而不是:

(1,80)

但是 df.loc[0:0].shapedf[0:1].shape 都显示正确的形状。

df.loc[0] returns 一维 pd.Series 表示单行数据的对象,通过索引提取。

df.loc[0:0] returns 一个 二维 pd.DataFrame 对象表示数据框中的一行数据,通过切片提取。

如果打印这些操作的结果,您可以更清楚地看到这一点:

import pandas as pd, numpy as np

df = pd.DataFrame(np.arange(9).reshape(3, 3))

res1 = df.loc[0]
res2 = df.loc[0:0]

print(type(res1), res1, sep='\n')

<class 'pandas.core.series.Series'>
0    0
1    1
2    2
Name: 0, dtype: int32

print(type(res2), res2, sep='\n')

<class 'pandas.core.frame.DataFrame'>
   0  1  2
0  0  1  2

约定遵循 NumPy 索引/切片。这是很自然的,因为 Pandas 是建立在 NumPy 数组上的。

arr = np.arange(9).reshape(3, 3)

print(arr[0].shape)    # (3,), i.e. 1-dimensional
print(arr[0:0].shape)  # (0, 3), i.e. 2-dimensional

当您调用 df.iloc[0] 时,它选择第一行并且类型为 Series 而在其他情况下 df.iloc[0:0] 它正在对行进行切片并且类型为 dataframe .而 Series 根据 pandas Series documentation :

One-dimensional ndarray with axis labels

dataframe 二维的 (pandas Dataframe documentation).

尝试 运行 以下几行以查看差异:

print(type(df.iloc[0]))
# <class 'pandas.core.series.Series'>

print(type(df.iloc[0:0]))
# <class 'pandas.core.frame.DataFrame'>