我注意到单列数据帧几次懊恼(下面的例子);但在大多数其他情况下,单列数据框只是一个系列。是否有任何押韵或理由说明为什么要退回一列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?
答案 0 :(得分:6)
通常,当操作 返回多列DataFrame时,将返回单列DataFrame。例如,当您使用布尔列索引时,如果有多个True值,则必须返回多列DataFrame,因此即使只有一列,也将始终返回DataFrame。同样,在设置索引时,如果您的DataFrame有两列以上,那么在为索引删除一个后,结果仍然必须是DataFrame,因此即使它只剩下一列,它仍然是一个DataFrame。
相反,如果您执行df.ix[:,'col']
之类的操作,则会返回一个系列,因为无法将一个列名称传递给选择,可以选择多个列。
这个想法是,有时候做一个操作不应该返回一个DataFrame,有时候会根据操作数特有的特征返回一个系列(即它们碰巧有多少列,你的布尔掩码中有多少个值为True)。当你执行df.set_index('col')
时,如果你知道你将永远得到一个DataFrame,那就更简单了,而不必担心原始版本有多少列。
请注意,还有DataFrame方法.squeeze()
用于将单列DataFrame转换为系列。