Pandas 的铸型是按列/系列应用的。一般来说,Pandas 不能很好地处理混合类型,或者object
数据类型。您应该期望内部逻辑能够确定一系列最有效的数据类型。在这种情况下,Pandas 选择了float
dtype 适用于包含以下内容的系列float
and bool
价值观。在我看来,这是高效且简洁的。
但是,正如您所指出的,当您有转置的输入数据集时,这将不起作用。让我们从头开始设置一个示例:
import pandas as pd, numpy as np
df = pd.DataFrame({'A': [True, False, True, True],
'B': [np.nan, np.nan, np.nan, False],
'C': [True, 'hello', np.nan, True]})
df = df.astype({'A': bool, 'B': float, 'C': object})
print(df)
A B C
0 True NaN True
1 False NaN hello
2 True NaN NaN
3 True 0.0 True
选项 1:更改“行数据类型”
您可以在不转置数据的情况下更改行中对象的数据类型。这将迫使B系列拥有object
dtype,即存储指向任意类型的指针的系列:
df.iloc[3] = df.iloc[3].astype(bool)
print(df)
A B C
0 True NaN True
1 False NaN hello
2 True NaN NaN
3 True False True
print(df.dtypes)
A bool
B object
C object
dtype: object
选项 2:转置并转换为布尔值
在我看来,这是更好的选择,因为数据类型被附加到特定类别/系列的输入数据。
df = df.T # transpose dataframe
df[3] = df[3].astype(bool) # convert series to Boolean
print(df)
0 1 2 3
A True False True True
B NaN NaN NaN False
C True hello NaN True
print(df.dtypes)
0 object
1 object
2 object
3 bool
dtype: object