我使用.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)
我可以手动将该系列转换回数据帧,但它看起来很麻烦,还需要进行案例测试,看看我是否应该这样做.是否有一种更简洁的方法可以让数据帧重新开始?
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)
现在,这可能需要对代码进行一些重构,以便您始终使用列表进行访问,即使列表只有一个元素,但在实践中它对我很有用.
| 归档时间: |
|
| 查看次数: |
361 次 |
| 最近记录: |