代码之家  ›  专栏  ›  技术社区  ›  melatonin15

Pandas dataframe的切片列在从该列创建的新对象中一直提到原始列名

  •  1
  • melatonin15  · 技术社区  · 6 年前

    我从一个pandas数据框中切片来创建对象标签。原始数据框中列的名称为 y .

    现在当我计算 label 把它分配给 m ,在打印时它一直显示 是的 . 为什么要这样做,写作的意思是什么 y 50.0 ?

    >>> type(label)
    <class 'pandas.core.frame.DataFrame'>
    >>> label.head(2)
         y
    0  1.0
    1  1.0
    >>> m = label.sum()
    >>> m
    y    50.0
    dtype: float64
    >>> 
    
    3 回复  |  直到 6 年前
        1
  •  0
  •   deadvoid    6 年前

    你的 label DataFrame只包含一个名为 y 有50行 1.0 ,所以它回来了 sum of y . 在代码中,该名称成为索引名称(单个列的总和),因为DataFrame中的所有索引 需要 一个名字,你可以用 m.index = <insert a name or int here> ,但是 m.index = None 将提高 TypeError 例外。

    >>> import pandas as pd
    >>> import numpy as np
    
    >>> df = pd.DataFrame(np.ones(50), columns=['y'])
    >>> df.head(2)
         y
    0  1.0
    1  1.0
    >>> df
          y
    0   1.0
    1   1.0
    2   1.0
    3   1.0
    4   1.0
    ... # reducted
    48  1.0
    49  1.0
    >>> df.sum()
    y    50.0
    dtype: float64
    
    >>> m = df.sum()
    >>> m
    y    50.0
    dtype: float64
    >>> m.index
    Index(['y'], dtype='object')
    >>> m.index = None
    Traceback (most recent call last):
     ...
    TypeError: Index(...) must be called with a collection of some kind, None was passed
    
        2
  •  0
  •   ipramusinto    6 年前

    你可能在期待 m 作为 float . 不, 是一个 Series .

    >>> type(m) # to know type of `m`
    pandas.core.series.Series
    
    >>> m.dtype # to know type of data contained in `m`
    dtype('float64')
    

    DataFrame.sum() 通常会返回一个序列(或在某些情况下返回数据帧)。见 docs .

    所以当你打印 你没有得到唯一的号码 50.0 ,而不是你得到的系列 具有 y 作为索引,并且 五十 作为价值。

        3
  •  0
  •   jpp    6 年前

    使用 label['y'].sum()

    label 是一个 pd.DataFrame 对象,和 pd.DataFrame.sum 不同于 pd.Series.sum . "对数据帧求和“无参数”意味着对所有索引求和 每列 . 为此,如果您想明确表示,可以使用 axis=0 ,但这不是必需的:

    sums_by_col = label.sum(axis=0)
    

    但你真正想要的是 pd.Series.sum :

    sum_of_series = label['y'].sum()