强制 pandas .iloc 返回单行数据框?
Posted
技术标签:
【中文标题】强制 pandas .iloc 返回单行数据框?【英文标题】:Forcing pandas .iloc to return a single-row dataframe? 【发布时间】:2018-02-09 21:56:53 【问题描述】:出于编程目的,我希望.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,它默认总是返回一个数据框。
【问题讨论】:
.loc
不总是返回pd.DataFrame
,确实,尝试df.loc[0,:]
,你会得到相同的行为。
@juanpa.arrivillaga 你是对的——我会从我的帖子中编辑错误的信息。
【参考方案1】:
single_Sample1=df.iloc[7:10]
single_Sample1
[1]:https://i.stack.imgur.com/RHHDZ.png**strong文字**
【讨论】:
【参考方案2】:双括号方法并不总是适合我(例如,当我使用条件选择带有 loc 的时间戳行时)。
但是,您可以将to_frame()
添加到您的操作中。
>>> df = pd.DataFrame('a':[1,2], 'b':[3,4])
>>> df2 = df.iloc[0, :].to_frame()
>>> type(df2)
<class 'pandas.core.frame.DataFrame'>
【讨论】:
【参考方案3】:按标签访问行: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
类似的语法。
【讨论】:
【参考方案4】:请使用以下选项:
df1 = df.iloc[[0],:]
#type(df1)
df1
或
df1 = df.iloc[0:1,:]
#type(df1)
df1
【讨论】:
【参考方案5】:使用双括号,
df.iloc[[0]]
输出:
a b
0 1 3
print(type(df.iloc[[0]])
<class 'pandas.core.frame.DataFrame'>
df.iloc[[0],:]
的缩写
【讨论】:
请注意,它也适用于df.loc[[0], :]
!我来这里是为了希望并找到了金子。谢谢
多么优雅的解决方案!
大声笑,我已经使用 pandas 很长时间了,我现在才意识到这一点。我只是用来调用to_frame
然后转帧。以上是关于强制 pandas .iloc 返回单行数据框?的主要内容,如果未能解决你的问题,请参考以下文章
pandas使用iloc函数基于dataframe数据行(row)的索引抽取单行或者多行数据其中多行索引需要嵌入在列表方括号[]中或使用:符号形成起始和终止范围索引
python pandas.DataFrame选取修改数据最好用.loc,.iloc,.ix