繁体   English   中英

强制 pandas .iloc 返回单行数据框?

[英]Forcing pandas .iloc to return a single-row dataframe?

出于编程目的,我希望.iloc始终返回一个数据帧,即使结果数据帧只有一行。 如何做到这一点?

目前,当结果只有一行时, .iloc返回一个系列。 例子:

In [1]: df = pd.DataFrame({'a':[1,2], 'b':[3,4]})

In [2]: df
Out[2]:
   a  b
0  1  3
1  2  4

In [3]: type(df.iloc[0, :])
Out[3]: pandas.core.series.Series

这种行为很糟糕,原因有两个:

  • 根据选择的行数, .iloc可以返回一个系列或一个数据框,迫使我在我的代码中手动检查这个

- .loc另一方面,总是返回一个数据框,使 pandas本身不一致 (错误的信息,如评论中所指出的)

对于 R 用户,这可以通过drop = FALSE或使用 tidyverse 的 tibble 来完成,默认情况下它总是返回一个数据帧。

使用双括号,

df.iloc[[0]]

输出:

   a  b
0  1  3

print(type(df.iloc[[0]])

<class 'pandas.core.frame.DataFrame'>

df.iloc[[0],:]的缩写

按标签访问行: loc

# Setup
df = pd.DataFrame({'X': [1, 2, 3], 'Y':[4, 5, 6]}, index=['a', 'b', 'c'])
df        

   X  Y
a  1  4
b  2  5
c  3  6

要获取 DataFrame 而不是 Series,请传递长度为 1 的索引列表,

df.loc[['a']]
# Same as
df.loc[['a'], :] # selects all columns

   X  Y
a  1  4

要选择多个特定行,请使用

df.loc[['a', 'c']] 

   X  Y
a  1  4
c  3  6

要选择连续范围的行,请使用

df.loc['b':'c'] 

   X  Y
b  2  5
c  3  6

按位置访问行: iloc

指定长度为 1 的索引列表,

i = 1
df.iloc[[i]]

   X  Y
b  2  5

或者,指定长度为 1 的切片:

df.iloc[i:i+1] 

   X  Y
b  2  5

要选择多行或连续切片,您可以使用与loc类似的语法。

双括号方法并不总是适合我(例如,当我使用条件选择带有 loc 的时间戳行时)。

但是,您可以将to_frame()添加到您的操作中。

>>> df = pd.DataFrame({'a':[1,2], 'b':[3,4]})

>>> df2 = df.iloc[0, :].to_frame().transpose()

>>> type(df2)
<class 'pandas.core.frame.DataFrame'>

请使用以下选项:

df1 = df.iloc[[0],:]
#type(df1)
df1

或者

df1 = df.iloc[0:1,:]
#type(df1)
df1

要从 Dataframe 中提取单行,请使用:

df_name.iloc[index,:].to_frame().transpose()
single_Sample1=df.iloc[7:10]
single_Sample1

[1]: https ://i.stack.imgur.com/RHHDZ.png**强文本**

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM