【问题标题】:Does pandas have a default fill value when constructing a dataframe of a specific dtype?构建特定 dtype 的数据框时,pandas 是否有默认填充值?
【发布时间】:2017-01-04 09:46:15
【问题描述】:

考虑字典d

d = {'A': {'x': 1, 'y': 1}, 'B': {'y': 1, 'z': 1}}

当我将它传递给 pandas.DataFrame 构造函数时,我知道我会丢失第 x 行 B 列和 z 行 A 列的值。

df = pd.DataFrame(d)
df

     A    B
x  1.0  NaN
y  1.0  1.0
z  NaN  1.0

我希望那些NaN 填写0。我当然知道我可以填写。

df.fillna(0)

但现在他们都是花车

     A    B
x  1.0  0.0
y  1.0  1.0
z  0.0  1.0

是的!我本可以将它们强制为整数

df.fillna(0).astype(int)

   A  B
x  1  0
y  1  1
z  0  1

或者!我本可以用一个聪明的字典理解构建一个系列,并用一个 fill_value 参数来取消堆叠

pd.Series(
    {(i, j): v for j, d_ in d.items() for i, v in d_.items()}
).unstack(fill_value=0)

但是,如果有一种直接的方法可以从一开始就用默认值填充缺失值,那么这一切都会变得容易得多。我希望像

pd.DataFrame(d, dtype=int, fill_value=0)

我知道这不可用,但我还有什么遗漏的吗?

【问题讨论】:

  • 这里的 dtype 是由于缺失值而推断出来的,因为您必须填充缺失值作为后处理步骤,您需要强制转换为 int 以强制 dtype跨度>
  • @EdChum 是的!当我做pd.DataFrame(d) 时,它必须推断。但是,如果我在构造函数中指定了 dtype,那么能够指定如何处理缺失会很方便。
  • 一种可能的解决方案是在dict 中添加缺少的键并将val 设置为0 - see here

标签: python pandas


【解决方案1】:

由于pandas 0.24,您可以使用 Int64 dtype:

import pandas as pd    
d = {'A': {'x': 1, 'y': 1}, 'B': {'y': 1, 'z': 1}}    
pd.DataFrame(d, dtype='Int64').fillna(0)

输出:

    A   B
x   1   0
y   1   1
z   0   1

注意“Int64”中的大写I。如果你用较低的'i'写它,即'int64',你会得到浮点数。

【讨论】:

  • 我今天最喜欢的答案:)!对于所有人:Int64 是一个 integer 数据类型,可以表示 NANs!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-07-03
  • 2022-12-21
  • 1970-01-01
  • 1970-01-01
  • 2014-08-24
  • 2022-06-13
相关资源
最近更新 更多