为什么我只使用一列与系列相比得到Pandas数据框?

时间:2014-09-18 19:33:16

标签: python pandas dataframe series

我注意到单列数据帧几次懊恼(下面的例子);但在大多数其他情况下,单列数据框只是一个系列。是否有任何押韵或理由说明为什么要退回一列DF?

示例:

1)当通过布尔掩码索引列时,掩码只有一个真值

df = pd.DataFrame([list('abc'), list('def')], columns = ['foo', 'bar', 'tar'])
mask = [False, True, False]
type(df.ix[:,mask])

2)当在DataFrame上设置一个只有两列的索引时:

df = pd.DataFrame([list('ab'), list('de'), list('fg')], columns = ['foo', 'bar']
type(df.set_index('foo'))

我觉得如果我期待只有一列的DF,我可以通过调用来处理它

pd.Series(df.values().ravel(), index = df.index)

但在大多数其他情况下,单列数据框只是一个系列。是否有任何押韵或理由说明为什么要退回一列DF?

1 个答案:

答案 0 :(得分:6)

通常,当操作 返回多列DataFrame时,将返回单列DataFrame。例如,当您使用布尔列索引时,如果有多个True值,则必须返回多列DataFrame,因此即使只有一列,也将始终返回DataFrame。同样,在设置索引时,如果您的DataFrame有两列以上,那么在为索引删除一个后,结果仍然必须是DataFrame,因此即使它只剩下一列,它仍然是一个DataFrame。

相反,如果您执行df.ix[:,'col']之类的操作,则会返回一个系列,因为无法将一个列名称传递给选择,可以选择多个列。

这个想法是,有时候做一个操作不应该返回一个DataFrame,有时候会根据操作数特有的特征返回一个系列(即它们碰巧有多少列,你的布尔掩码中有多少个值为True)。当你执行df.set_index('col')时,如果你知道你将永远得到一个DataFrame,那就更简单了,而不必担心原始版本有多少列。

请注意,还有DataFrame方法.squeeze()用于将单列DataFrame转换为系列。