我有一个名为df
的pandas DataFrame,其中df.shape
是(53, 80)
,其中索引和列都是int
。
如果我选择这样的第一行,则会得到:
df.loc[0].shape
(80,)
而不是:
(1,80)
但是df.loc[0:0].shape
或df[0:1].shape
都显示正确的形状。
答案 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'>