为什么'+'系列'会创建空值

时间:2017-11-16 15:03:05

标签: python pandas series

所以这更像是一个问题,而不是我遇到的问题。

我想和.append()一些大熊猫系列'在一起,不假思索,我只是total=series1+series2+series3

每个系列的长度分别为2199902,171175和178989,sum(pd.isnull(i) for i in total) = 2214596

P.S所有3个系列'都没有空值,是否与合并3个不同长度的系列产生了缺失值?即使这就是为什么会创建航空2,214,596空值?

2 个答案:

答案 0 :(得分:4)

如果您正在尝试追加系列,那么您做错了。 +运算符调用.add,最终添加系列中的每个对应元素。如果您的系列未对齐,则会导致生成大量NaN

如果您想将追加这些一起添加到一个长系列中,您可以使用pd.concat

pd.concat([s1, s2, s3], ignore_index=True)
0     1
1     2
2     4
3     5
4     4
5     7
6    40
7    70
dtype: int64

数据来自jezrael's post

如果您要使用append,可以循环播放,或使用reduce

s = s1

for i in [s2, s3]:
    s = s.append(i, ignore_index=True)

s
0     1
1     2
2     4
3     5
4     4
5     7
6    40
7    70
dtype: int64
from functools import reduce

reduce(lambda x, y: x.append(y, ignore_index=True), [s1, s2, s3])

0     1
1     2
2     4
3     5
4     4
5     7
6    40
7    70
dtype: int64

两种解决方案都非常适用于多个系列,但与pd.concatnp.concatenate相比,它们速度较慢。

答案 1 :(得分:2)

如果sum系列所有索引都对齐。因此,如果某个索引存在于series1而不存在于另一个Series中,请获取NaN s。

因此fill_value=0需要add

s = s1.add(s2, fill_value=0).add(s3, fill_value=0)

样品:

s1 = pd.Series([1,2,4,5])
s2 = pd.Series([4,7], index=[10,11])
s3 = pd.Series([40,70], index=[2,4])

s = s1.add(s2, fill_value=0).add(s3, fill_value=0)
print (s)
0      1.0
1      2.0
2     44.0
3      5.0
4     70.0
10     4.0
11     7.0
dtype: float64

但如果需要将它们一起添加(或使用concat提及cᴏʟᴅsᴘᴇᴇᴅ):

s = s1.append(s2, ignore_index=True).append(s3, ignore_index=True)
print (s)
0     1
1     2
2     4
3     5
4     4
5     7
6    40
7    70
dtype: int64

numpy alternative:

#alternative, thanks cᴏʟᴅsᴘᴇᴇᴅ - np.concatenate([s1, s2, s3])
s = pd.Series(np.concatenate([s1.values, s2.values, s3.values]))

print (s)
0     1
1     2
2     4
3     5
4     4
5     7
6    40
7    70
dtype: int64

如果要使用+进行追加,则需要将系列转换为列表:

s = pd.Series(s1.tolist() + s2.tolist() + s3.tolist())
print (s)
0     1
1     2
2     4
3     5
4     4
5     7
6    40
7    70
dtype: int64