Pandas:扩展序列索引以包含范围内所有值

9 投票
2 回答
10295 浏览
提问于 2025-04-30 14:35

我有一个 pandas 的序列,看起来是这样的:

>>> x.sort_index()
2       1
5       2
6       3
8       4

我想把这个序列填满,让“缺失”的索引行也能显示出来,并用 0 来填充这些数据值。

这样当我列出新的序列时,它看起来应该是这样的:

>>> z.sort_index()
1       0
2       1
3       0
4       0
5       2
6       3
7       0
8       4

我试着创建一个“虚拟”的序列

>>> y = pd.Series([0 for i in range(0,8)])
0    0
1    0
2    0
3    0
4    0
5    0
6    0
7    0

然后把它们拼接在一起,但结果要么是:

>>> pd.concat([x,z],axis=0)
2    1
5    2
6    3
8    4
0    0
1    0
2    0
3    0
4    0
5    0
6    0
7    0

要么是

>>> pd.concat([x,z],axis=1)
    0   1
0 NaN   0
1 NaN   0
2   1   0
3 NaN   0
4 NaN   0
5   2   0
6   3   0
7 NaN   0
8   4 NaN

这两种结果都不是我想要的结构。

我可以尝试在 axis=1 的版本上做一些算术运算,把第 1 列和第 2 列相加,但我想找一个更简洁的一行代码来实现这个功能——有没有这样的索引填充或清理操作?如果有的话,它是什么?

暂无标签

2 个回答

0

抱歉,情况有点尴尬,不过我在这里读到了一些关于如何处理这种情况的建议,所以决定给自己的问题提供一个答案。

我在这里阅读了文档 ,我想要实现的功能有一种方法是这样的:

>>> x.combine_first(y)
0    0
1    0
2    1
3    0
4    0
5    2
6    3
7    0
8    4
dtype: float64

注意,上面的内容,

>>> y = pd.Series([0 for i in range(0,8)])
20

你需要的是一个叫做 reindex 的功能。首先,你要创建一个你想要的索引(在这个例子中,就是一个简单的范围),然后用这个索引来重新调整数据:

In [64]: x = pd.Series([1,2,3,4], index=[2,5,6,8])

In [65]: x
Out[65]:
2    1
5    2
6    3
8    4
dtype: int64

In [66]: x.reindex(range(9), fill_value=0)
Out[66]:
0    0
1    0
2    1
3    0
4    0
5    2
6    3
7    0
8    4
dtype: int64

撰写回答