【问题标题】:How do I convert a pandas Series or index to a Numpy array? [duplicate]如何将熊猫系列或索引转换为 Numpy 数组? [复制]
【发布时间】:2013-06-18 22:12:08
【问题描述】:

你知道如何将 DataFrame 的索引或列作为 NumPy 数组或 python 列表获取吗?

【问题讨论】:

  • 这能回答你的问题吗? Convert pandas dataframe to NumPy array
  • 注意: 必须像这样将 Pandas DataFrame 转换为数组(或列表)可能表明存在其他问题。我强烈建议确保 DataFrame 是适合您的特定用例的数据结构,并且 Pandas 不包含任何执行您感兴趣的操作的方式。
  • 关于我重新提出这个问题的投票: 从技术上讲,pandas 系列与 pandas 数据框不同。答案可能相同,但问题肯定不同。

标签: python pandas


【解决方案1】:

您可以使用df.index 访问索引对象,然后使用df.index.tolist() 获取列表中的值。同样,您可以将df['col'].tolist() 用于系列。

【讨论】:

  • 它返回 instanceMethod 而不是列表数组
  • @VShreyas ,df.index.values.tolist() 怎么样?
  • df.index.tolist() 不返回实例方法。它返回一个索引列表。它是在 pandas 索引上定义的方法。虽然首先调用值是可能的,但将工作委派给 numpy 并不是一种修正——只是一种替代方法。
【解决方案2】:

要获取 NumPy 数组,您应该使用 values 属性:

In [1]: df = pd.DataFrame({'A': [1, 2, 3], 'B': [4, 5, 6]}, index=['a', 'b', 'c']); df
   A  B
a  1  4
b  2  5
c  3  6

In [2]: df.index.values
Out[2]: array(['a', 'b', 'c'], dtype=object)

这会访问数据的存储方式,因此无需进行转换。
注意:此属性也可用于许多其他 pandas 的对象。

In [3]: df['A'].values
Out[3]: Out[16]: array([1, 2, 3])

要将索引作为列表获取,请调用tolist

In [4]: df.index.tolist()
Out[4]: ['a', 'b', 'c']

同样,对于列。

【讨论】:

  • 注意:.values 已被弃用,.to_numpy() 是如果您想要 NumPy 数组的建议替代品。您能否扩展一下这会访问数据的存储方式,因此无需进行转换
  • answer by cs95 很好地解释了.values.to_numpy().array
【解决方案3】:

从pandas v0.13开始你也可以使用get_values:

df.index.get_values()

【讨论】:

  • this和.values有区别吗? (我更新了版本信息,因为这个函数出现在 0.13.0 文档中。)
  • @Andy Hayden:.get_values 是仅获取当前值的官方方法,而 .values(例如在多索引上)可能返回行或列已被删除?
  • @EzekielKruglick 所以它总是一个副本?链接到文档的内容非常简单,我不认为你会受到这样的欺骗(即使他们在 MI 他们不会在 .values 中)会很高兴看到一个例子来证明这一点!跨度>
  • @AndyHayden:我想我看错了你的评论。你是对的,.values 很好,.level 给出了过时的值,get_values 给出了正确的当前值,不包括删除的行/列。原始 github 问题:github.com/pydata/pandas/issues/3686 但我刚刚检查了一下,它看起来像 .values (当然!)以不同于我认为我们正在谈论的形式提供最新信息
  • @AndyHayden 不,没有区别。 get_values 只需调用 .values。需要输入更多字符。
【解决方案4】:

如果您正在处理多索引数据框,您可能有兴趣仅提取多索引的一个名称的列。你可以这样做

df.index.get_level_values('name_sub_index')

当然name_sub_index 必须是FrozenList df.index.names 的一个元素

【讨论】:

    【解决方案5】:

    我将熊猫dataframe 转换为list,然后使用基本的list.index()。像这样的:

    dd = list(zone[0]) #Where zone[0] is some specific column of the table
    idx = dd.index(filename[i])
    

    您的索引值为idx

    【讨论】:

    • 然后使用了基本的list.index()这与将Series转换为列表的问题有什么关系?
    【解决方案6】:

    熊猫 >= 0.24

    弃用 .values 以支持这些方法!

    从 v0.24.0 开始,我们将提供两种全新的首选方法,用于从 IndexSeriesDataFrame 对象获取 NumPy 数组:它们是 to_numpy().array。关于用法,文档提到:

    我们尚未删除或弃用 Series.valuesDataFrame.values,但我们强烈推荐并使用.array.to_numpy() 代替。

    请参阅this section of the v0.24.0 release notes 了解更多信息。


    to_numpy() Method

    df.index.to_numpy()
    # array(['a', 'b'], dtype=object)
    
    df['A'].to_numpy()
    #  array([1, 4])
    

    默认情况下,返回一个视图。所做的任何修改都会影响原件。

    v = df.index.to_numpy()
    v[0] = -1
    
    df
        A  B
    -1  1  2
    b   4  5
    

    如果您需要副本,请使用to_numpy(copy=True);

    v = df.index.to_numpy(copy=True)
    v[-1] = -123
    
    df
       A  B
    a  1  2
    b  4  5
    

    请注意,此函数也适用于 DataFrames(而 .array 不适用)。


    array Attribute
    此属性返回支持索引/系列的ExtensionArray 对象。

    pd.__version__
    # '0.24.0rc1'
    
    # Setup.
    df = pd.DataFrame([[1, 2], [4, 5]], columns=['A', 'B'], index=['a', 'b'])
    df
    
       A  B
    a  1  2
    b  4  5
    

    df.index.array    
    # <PandasArray>
    # ['a', 'b']
    # Length: 2, dtype: object
    
    df['A'].array
    # <PandasArray>
    # [1, 4]
    # Length: 2, dtype: int64
    

    从这里,可以使用list获取列表:

    list(df.index.array)
    # ['a', 'b']
    
    list(df['A'].array)
    # [1, 4]
    

    或者,直接拨打.tolist():

    df.index.tolist()
    # ['a', 'b']
    
    df['A'].tolist()
    # [1, 4]
    

    关于返回的内容,文档提到,

    对于由普通 NumPy 数组支持的 SeriesIndexes,Series.array 将返回一个新的arrays.PandasArray,这是一个薄(无副本) 包装 numpy.ndarrayarrays.PandasArray 不是特别 它本身很有用,但它确实提供了与任何 在 pandas 或第三方库中定义的扩展数组。

    所以,总而言之,.array 将返回任一

    1. 支持索引/系列的现有ExtensionArray,或
    2. 如果有支持该系列的 NumPy 数组,则会创建一个新的 ExtensionArray 对象作为底层数组的薄包装器。

    添加两种新方法的理由
    这些功能是在两个 GitHub 问题 GH19954GH23623 下讨论的结果添加的。

    具体来说,文档提到了理由:

    [...] with .values 不清楚返回值是否是 实际数组,对其进行一些转换,或熊猫自定义之一 数组(如Categorical)。例如,PeriodIndex.values 每次生成一个新的ndarray 周期对象。 [...]

    这两个功能旨在提高 API 的一致性,这是朝着正确方向迈出的重要一步。

    最后,.values 在当前版本中不会被弃用,但我预计这可能会在未来的某个时候发生,所以我会敦促用户尽快迁移到更新的 API。

    【讨论】:

    • S = pd.Series( [3, 4] ); np.asarray( S ) is S.values 让我很惊讶;你知道这是否记录在任何地方吗? (numpy 1.21.5,熊猫 1.3.5)
    【解决方案7】:

    以下是将dataframe列转换为numpy数组的简单方法。

    df = pd.DataFrame(somedict) 
    ytrain = df['label']
    ytrain_numpy = np.array([x for x in ytrain['label']])
    

    ytrain_numpy 是一个 numpy 数组。

    我尝试使用to.numpy(),但它给了我以下错误: TypeError: no supported conversion for types: (dtype('O'),) 在使用线性 SVC 进行二元相关性分类时。 to.numpy() 正在将 dataFrame 转换为 numpy 数组,但内部元素的数据类型是列表,因此观察到上述错误。

    【讨论】:

    • 我尝试使用 to.numpy() 但它给了我以下错误: TypeError: no supported conversion for types: (dtype('O'),) while doing Binary Relevance classfication using线性 SVC。 to.numpy() 将 dataFrame 转换为 numpy 数组,但内部元素的数据类型是 list,因此观察到上述错误。 不过,这并不是 to_numpy 的错。
    【解决方案8】:

    最近的一种方法是使用 .to_numpy() 函数。

    如果我有一个带有“价格”列的数据框,我可以将其转换如下:

    priceArray = df['price'].to_numpy()
    

    您也可以将数据类型,例如浮点数或对象,作为函数的参数传递

    【讨论】:

      猜你喜欢
      • 2017-10-29
      • 2016-01-27
      • 1970-01-01
      • 2021-03-01
      • 2016-11-22
      • 2021-12-20
      • 2021-01-22
      • 2019-03-26
      相关资源
      最近更新 更多