构建特定 dtype 的数据框时,pandas 是否具有默认填充值?

piR*_*red 7 python pandas

考虑字典d

d = {'A': {'x': 1, 'y': 1}, 'B': {'y': 1, 'z': 1}}
Run Code Online (Sandbox Code Playgroud)

当我将它传递给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
Run Code Online (Sandbox Code Playgroud)

我想要那些NaN0. 我当然知道我可以填写。

df.fillna(0)
Run Code Online (Sandbox Code Playgroud)

但现在他们都是花车

     A    B
x  1.0  0.0
y  1.0  1.0
z  0.0  1.0
Run Code Online (Sandbox Code Playgroud)

是的!我可以强迫他们使用整数

df.fillna(0).astype(int)

   A  B
x  1  0
y  1  1
z  0  1
Run Code Online (Sandbox Code Playgroud)

或者!我本可以用巧妙的字典理解构建一个系列,并用 fill_value 参数拆开

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

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

pd.DataFrame(d, dtype=int, fill_value=0)
Run Code Online (Sandbox Code Playgroud)

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

abo*_*vel 12

pandas 0.24开始,您可以使用 Int64 数据类型:

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

输出:

    A   B
x   1   0
y   1   1
z   0   1
Run Code Online (Sandbox Code Playgroud)

请注意“ I nt64”中的大写I。如果你用较低的“i”(即“int64”)编写它,你将得到浮点数。