使用.concat创建pandas数据框时,包括空系列。

7

更新:自 pandas 版本 0.18.1 起,这不再是一个问题。连接空的序列不会再将它们删除,因此此问题已过时。

我想使用.concat从系列列表中创建一个pandas数据帧。问题在于,当其中一个序列为空时,它不会被包含在生成的数据帧中,但是当我尝试使用多重索引重命名其列时,数据帧的维度就会出现错误。 更新:以下是一个示例...

import pandas as pd

sers1 = pd.Series()
sers2 = pd.Series(['a', 'b', 'c'])
df1 = pd.concat([sers1, sers2], axis=1)

这将生成以下数据框:
>>> df1
0    a
1    b
2    c
dtype: object

但我希望它能生成类似于这样的东西:
>>> df2
    0  1
0 NaN  a
1 NaN  b
2 NaN  c

如果我在ser1中的任何地方放置一个单一的NAN值,它就会这样做。但即使我的一些系列完全为空,似乎也应该可以自动完成这个操作。

1
我尝试了一下。如果这不是你想要的,你可能需要发布一些示例数据,以使你试图做什么更加明显。 - JohnE
1
你能提供一个小例子吗?可能的解决方案是使用所有系列名称构建的索引重新索引结果数据帧。 - joris
1个回答

7

通过传递levels参数可以解决问题。以下是一个例子。首先,让我们看一下错误的方法:

import pandas as pd
ser1 = pd.Series()
ser2 = pd.Series([1, 2, 3])
list_of_series = [ser1, ser2, ser1]
df = pd.concat(list_of_series, axis=1)

这会产生以下结果:
>>> df
   0
0  1
1  2
2  3

但如果我们为 levels 参数添加一些标签,它将包括所有空序列:

import pandas as pd
ser1 = pd.Series()
ser2 = pd.Series([1, 2, 3])
list_of_series = [ser1, ser2, ser1]
labels = range(len(list_of_series))
df = pd.concat(list_of_series, levels=labels, axis=1)

这将生成所需的数据框:

>>> df
    0  1   2
0 NaN  1 NaN
1 NaN  2 NaN
2 NaN  3 NaN

1
此外,这似乎是一个版本问题。在 Windows 8.1 上使用 pandas 版本 0.12.0,我从未遇到过删除空系列的问题。但是在 Linux 上使用 pandas 版本 0.15.2,我遇到了这个问题。 - Alex

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