切片 1 行 pandas 数据帧时,切片变为系列

Posted

技术标签:

【中文标题】切片 1 行 pandas 数据帧时,切片变为系列【英文标题】:When slicing a 1 row pandas dataframe the slice becomes a series 【发布时间】:2018-01-30 19:08:49 【问题描述】:

为什么当我对仅包含 1 行的 pandas 数据框进行切片时,切片会变成 pandas 系列? 如何将其保留为数据框?

df=pd.DataFrame(data=[[1,2,3]],columns=['a','b','c'])
df
Out[37]: 
   a  b  c
0  1  2  3


a=df.iloc[0]

a
Out[39]: 
a    1
b    2
c    3
Name: 0, dtype: int64

【问题讨论】:

那不是切片。尝试像df.iloc[0:1] 这样的真正切片。 @Goyo 我不同意,如果你检查slice 的文档字符串,它可能是slice(stop)slice(start, stop[, step]),所以只使用标量确实是一个有效的切片。跨度> @BradSolomon 是的,将标量传递给slice 将返回slice 的实例。然而,用单个标量索引df.iloc 不会切片dfdf.iloc.__getitem__(slice(n)) 将返回 DataFrame 或引发异常,它永远不会返回 Seriesdf.iloc[0]df.iloc.__getitem__(0) 相同——不涉及切片。 【参考方案1】:

为避免重新转换回 DataFrame 的中间步骤,索引时使用双括号:

a = df.iloc[[0]]
print(a)
   a  b  c
0  1  2  3

速度:

%timeit df.iloc[[0]]
192 µs per loop

%timeit df.loc[0].to_frame().T
468 µs per loop

【讨论】:

【参考方案2】:

或者你可以按索引切片

a=df.iloc[df.index==0]

a
Out[1782]: 
   a  b  c
0  1  2  3

【讨论】:

【参考方案3】:

使用to_frame()T 转置:

df.loc[0].to_frame()

   0
a  1
b  2
c  3

df.loc[0].to_frame().T

   a  b  c
0  1  2  3

选项#2 使用双括号[[]]

df.iloc[[0]]

   a  b  c
0  1  2  3

【讨论】:

我仍然有列作为索引

以上是关于切片 1 行 pandas 数据帧时,切片变为系列的主要内容,如果未能解决你的问题,请参考以下文章

按行切片 Pandas DataFrame

pandas 对数据帧DataFrame中数据的索引及切片操作

如何按位置对 Pandas 数据框进行切片?

沿着 pandas 数据框中的列进行高效的跨步切片

如何将 Pandas 系列中的连续 NaN 值分组到一组切片中?

pandas DataFrame数据筛选和切片