【问题标题】:pandas DataFrame combine_first method converts boolean in floatspandas DataFrame combine_first 方法将布尔值转换为浮点数
【发布时间】:2016-08-23 13:52:43
【问题描述】:

我遇到了一个奇怪的问题,combine_first 方法导致存储为 bool 的值向上转换为 float64。 示例:

In [1]: import pandas as pd

In [2]: df1 = pd.DataFrame({"a": [True]})

In [3]: df2 = pd.DataFrame({"b": ['test']})

In [4]: df2.combine_first(df1)
Out[4]:
     a     b
0  1.0  test

这个问题已经在 3 年前的一篇文章中报告过:pandas DataFrame combine_first and update methods have strange behavior。这个问题被告知要解决,但我在 pandas 0.18.1 下仍然有这种行为

感谢您的帮助

【问题讨论】:

  • 问题是什么?
  • 我想知道为什么 combine_first 方法不保留“a”列中的布尔值?

标签: python pandas dataframe


【解决方案1】:

在事件链中的某个地方要获得组合数据框,必须解决潜在的缺失值。我知道您的示例中没有遗漏任何内容。 Nonenp.nan 不是 intbool。因此,为了拥有一个包含boolNonenp.nan 的公共dtype,必须将列转换为objectfloat。作为“浮动”,大量操作变得更加高效,是一个不错的选择。这显然不是一直都是最好的选择,但仍然必须做出选择,pandas 试图推断出最好的选择。

解决方法:

设置

df1 = pd.DataFrame({"a": [True]})
df2 = pd.DataFrame({"b": ['test']})

df3 = df2.combine_first(df1)
df3

解决方案

dtypes = df1.dtypes.combine_first(df2.dtypes)

for k, v in dtypes.iteritems():
    df3[k] = df3[k].astype(v)

df3

【讨论】:

    【解决方案2】:

    我遇到了同样的问题。这种特殊情况似乎还没有在 Pandas 中得到修复。我已提交错误报告:

    https://github.com/pandas-dev/pandas/issues/20699

    【讨论】:

    • @Stephen Rauch:我添加了您删除的评论,因为我看到答案因为不是问题的答案而被否决。严格来说,我不是在回答这个问题。我只是想帮助其他人,因为我遇到了与海报和其他人相同的问题。
    • 我很清楚为什么会有文字。但是,我有两个选择之一。投票删除此答案,因为它不是答案。或者通过删除一堆与答案完全无关的文本将其变成答案。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-07-22
    • 2016-12-08
    • 1970-01-01
    • 2013-02-27
    • 1970-01-01
    • 2018-12-21
    • 2023-02-04
    相关资源
    最近更新 更多