如何在提取单行时保留pandas数据帧标识

use*_*645 2 python pandas

我使用.xs或.loc(它们似乎表现相同)通过索引提取我的数据帧的子集.当我的条件检索多行时,结果将保留一个数据帧.当只检索到一行时,它会自动转换为一个系列.我不希望这种行为,因为这意味着我需要处理下游的多个案例(可用于系列和数据帧的不同方法集).

In [1]: df = pd.DataFrame({'a':range(7), 'b':['one']*4 + ['two'] + ['three']*2,
 'c':range(10,17)})

In [2]: df.set_index('b', inplace=True)

In [3]: df.xs('one')
Out[3]:
     a   c
b
one  0  10
one  1  11
one  2  12
one  3  13

In [4]: df.xs('two')
Out[4]:
a     4
c    14
Name: two, dtype: int64

In  [5]: type(df.xs('two'))
Out [5]: pandas.core.series.Series
Run Code Online (Sandbox Code Playgroud)

我可以手动将该系列转换回数据帧,但它看起来很麻烦,还需要进行案例测试,看看我是否应该这样做.是否有一种更简洁的方法可以让数据帧重新开始?

DSM*_*DSM 7

IIUC,您可以简单地添加大括号[],并使用.loc:

>>> df.loc["two"]
a     4
c    14
Name: two, dtype: int64
>>> type(_)
<class 'pandas.core.series.Series'>
>>> df.loc[["two"]]
     a   c
b         
two  4  14

[1 rows x 2 columns]
>>> type(_)
<class 'pandas.core.frame.DataFrame'>
Run Code Online (Sandbox Code Playgroud)

这可能会提醒您numpy高级索引的工作原理:

>>> a = np.arange(9).reshape(3,3)
>>> a[1]
array([3, 4, 5])
>>> a[[1]]
array([[3, 4, 5]])
Run Code Online (Sandbox Code Playgroud)

现在,这可能需要对代码进行一些重构,以便您始终使用列表进行访问,即使列表只有一个元素,但在实践中它对我很有用.