为什么我的熊猫数据框的选择形状错误

时间:2018-07-09 16:33:36

标签: python pandas dataframe slice shape

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

如果我选择这样的第一行,则会得到:

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

而不是:

(1,80)

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

2 个答案:

答案 0 :(得分:2)

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

df.loc[0:0]返回一个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

答案 1 :(得分:2)

调用df.iloc[0]时,它选择的是第一行,类型为Series,而在其他情况下,df.iloc[0:0]则是对行进行切片,并且类型为dataframe。并且Series符合pandas Series documentation

  

带有轴标签的一维ndarray

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'>