【发布时间】: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。