切片 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
不会切片df
。 df.iloc.__getitem__(slice(n))
将返回 DataFrame
或引发异常,它永远不会返回 Series
。 df.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中数据的索引及切片操作