从具有混合数据类型的 MultiIndex 列的 DataFrame 中进行选择会返回类型错误的数据

问题描述 投票:0回答:1

我的数据框是这样组织的:

    import pandas as pd
    df = pd.DataFrame(
        columns=pd.MultiIndex.from_product([['Time','A','B'],[1,2]]),
        index=[0,1,2],
        data=[[0,1,2,3,4,5],[10,11,12,13,14,15],[20,21,22,23,24,25]],
        dtype=float)

现在我想为给定的行索引选择所有“B”列及其各自的 1 级列索引。实现这一目标的一种方法是

    df.loc[2,'B']

我明白了:

    1    24.0
    2    25.0
    Name: 2, dtype: float64

到目前为止,一切都很好。

现在让我们混合 DataFrame 中的数据类型。

    import datetime
    times = pd.date_range("2018-01-01", periods=3, freq="h").values
    df[('Time',1)] = times
    df[('Time',2)] = times
    df = df.sort_index(level=1,axis=1)

现在我的 DataFrame 在“时间”列中有

datetime
对象:

    df.dtypes
    
    A     1           float64
    B     1           float64
    Time  1    datetime64[ns]
    A     2           float64
    B     2           float64
    Time  2    datetime64[ns]
    dtype: object

现在让我们尝试与上面相同的选择:

    df.loc[2,'B']

但是这次我得到:

    1    24.0
    2    25.0
    Name: 2, dtype: object

也就是

dtype
变成了
object
! 但是等等,还有另一种方法可以选择我想要的数据:

    df.loc[2,('B',slice(None))]

这次我得到:

    B  1    24.0
       2    25.0
    Name: 2, dtype: float64

这是正确答案。 为什么会有这样的差异?为什么只有当数据类型混合时才会发生?

python pandas
1个回答
0
投票

df.loc[2, ['B']]
df['B'].loc[2]
也会返回正确的 dtype。

我相信这与轴切片的内部顺序有关。

确实

df.loc[2]
是一个对象系列,从该对象中进行切片仍然是对象。

© www.soinside.com 2019 - 2024. All rights reserved.