【问题标题】:Why do I get Pandas data frame with only one column vs Series?为什么我得到只有一列 vs 系列的 Pandas 数据框?
【发布时间】:2014-11-13 06:46:01
【问题描述】:

我已经多次注意到单列数据框,这让我非常懊恼(下面的示例);但在大多数其他情况下,单列数据框只是一个系列。关于为什么会返回一列 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 是否有任何押韵或原因?

【问题讨论】:

    标签: python pandas dataframe series


    【解决方案1】:

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

    相比之下,如果您执行df.ix[:,'col'] 之类的操作,它会返回一个系列,因为传递一个列名来选择是不可能选择多个列的。

    这个想法是,执行操作有时不应返回 DataFrame,有时不应返回基于操作数特定特征的 Series(即,它们碰巧有多少列,布尔掩码中有多少值为 True)。当您执行df.set_index('col') 时,如果您知道您将始终获得一个 DataFrame,那么就更简单了,而不必担心原来的列有多少。

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

    【讨论】:

    • Series.squeeze()(我认为)什么都不做,因此无需检查它是DataFrame还是Series就可以安全调用。
    • 感谢您的回答!我必须将 df.squeeze() 添加到我永无止境的非显而易见但超级有用的 pandas 函数列表中!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多