pandas concat 填充未对齐的索引值为 NaN

5

问题

我连接了两个int类型的序列,但返回的数据帧是float类型。这是因为序列的索引没有对齐,在连接发生时,pandas用NaN填充了这些缺失值。然而,NaN被认为是一种浮点数,不幸的是,它会将所有整数与之一起转换为浮点数。

问题

我的问题是如何用其他东西填补这些缺失值,而不会将我的整数转换为浮点数?

MCV

import pandas as pd

s1 = pd.Series([1], index=['A'])
s2 = pd.Series([1], index=['B'])

print "s1 type: {} | s2 type: {}\n".format(s1.dtype, s2.dtype)

df = pd.concat([s1, s2], axis=1)
print df, "\n"
print df.dtypes

输出:

s1 type: int64 | s2 type: int64

     0    1
A  1.0  NaN
B  NaN  1.0 

0    float64
1    float64
dtype: object

1
这是一个个人选择,你想要 0 还是 -1 或其他值,之后你可以在 fillna 后使用 df.astype(int),但是你知道 NaN 不能表示为整数,所以你必须决定你想要什么代替。 - EdChum
所以,@EdChum,你知道如果我想回答这个问题,而看到你在评论中提供了一个非常有效的答案,我会感到沮丧,因为我提供的答案太相似了。 这是我的天性,我认为有些人和我一样有这种特点......请将你刚才在评论中写的内容重复在答案中,这样我就可以接受它了。 - piRSquared
我对此没有任何困扰,因为这并不重要,所以请随意这么做。 - EdChum
1
我最终会自己公布答案,这样对其他人就很清楚了,我不会得到任何积分,并且会在上面贴上你的名字 ;-). 我喜欢积分,但适当的荣誉归属对我非常重要。 - piRSquared
只要你提到了出处,我认为就没有问题。个人而言,这不是一个问题,有些人可能会有意或无意地这样做,但我并不在意,因为这只是积分,而不是金钱或食物。 - EdChum
2个回答

2
首先,dtype的转换是由于整型无法表示NaN,因此选择了float数据类型。
其次,当发生这种情况时,如何处理取决于个人选择,没有正确的选择。
例如,我们可以使用fillna填充任意值,例如0-1,然后使用astype(int)将类型转换回来。
In [21]:
df.fillna(0).astype(int)

Out[21]:
   0  1
A  1  0
B  0  1

但这可能不是你想要的,你可能决定使用dropna来删除这些行,但这可能意味着你会失去有价值的信息,如果你正在进行某种机器学习或其他分析,则这些信息可能至关重要。
因此,你可能决定将这些列/行设置为最小/最大/平均值或中位数,但如果列值依赖于其他列,则这可能会产生严重后果,例如我们将所有缺失值设置为最小/最大值,但是该值会偏离预测模型,因为它失去了熵/信息,因为如果你有大量缺失值,则你的数据会偏向于最小/最大值。个人在这种情况下发现平均值效果很好。

0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接