我的数据框是这样组织的:
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
这是正确答案。 为什么会有这样的差异?为什么只有当数据类型混合时才会发生?
df.loc[2, ['B']]
或 df['B'].loc[2]
也会返回正确的 dtype。
我相信这与轴切片的内部顺序有关。
确实
df.loc[2]
是一个对象系列,从该对象中进行切片仍然是对象。