Pandas:使用 `loc` 更改为 `int` 将一行布尔值附加到 df

May*_*wal 6 python boolean dataframe pandas

考虑df

In [2098]: df = pd.DataFrame({'a': [1,2], 'b':[3,4]})

In [2099]: df
Out[2099]: 
   a  b
0  1  3
1  2  4
Run Code Online (Sandbox Code Playgroud)

现在,我尝试将一个list值附加到df

In [2102]: df.loc[2] = [3, 4]

In [2103]: df
Out[2103]: 
   a  b
0  1  3
1  2  4
2  3  4
Run Code Online (Sandbox Code Playgroud)

到目前为止一切都很好。

但是现在当我尝试添加带有布尔值列表的行时,它会将其转换为int

In [2104]: df.loc[3] = [True, False]

In [2105]: df
Out[2105]: 
   a  b
0  1  3
1  2  4
2  3  4
3  1  0
Run Code Online (Sandbox Code Playgroud)

我知道我可以将其转换dfstr然后附加布尔值,例如:

In [2131]: df = df.astype(str)
In [2133]: df.loc[3] = [True, False]

In [2134]: df
Out[2134]: 
      a      b
0     1      3
1     2      4
3  True  False
Run Code Online (Sandbox Code Playgroud)

但是,我想知道这种行为背后的原因。为什么当我附加到它时它不会自动将dtypes列更改为?objectboolean

我的熊猫版本是:

In [2150]: pd.__version__
Out[2150]: '1.1.0'
Run Code Online (Sandbox Code Playgroud)

Dan*_*ejo 3

当我向对象附加布尔值时,为什么它不会自动将列的数据类型更改为对象?

因为类型正在向上转换(请参阅upcasting),来自文档:

当与其他类型组合时,类型可能会被向上转型,这意味着它们从当前类型升级(例如 int 到 float)。

向上转换根据numpy 规则进行:

向上转型始终遵循 numpy 规则。如果一项操作涉及两种不同的数据类型,则将使用更通用的一种作为操作的结果。

要了解如何应用numpy 规则,您可以使用函数find_common_type,如下所示:

res = np.find_common_type([bool, np.bool], [np.int32, np.int64])
print(res)
Run Code Online (Sandbox Code Playgroud)

输出

int64
Run Code Online (Sandbox Code Playgroud)