gpt4 book ai didi

python - 如何将 Pandas 数据框转换为带有列名的 numpy 数组

转载 作者:行者123 更新时间:2023-12-04 15:13:11 25 4
gpt4 key购买 nike

  • 这必须使用矢量化方法,没有任何迭代

  • 我想从 Pandas 数据帧创建一个 numpy 数组。
    我的代码:
    import pandas as pd
    _df = pd.DataFrame({'itme': ['book', 'book' , 'car', ' car', 'bike', 'bike'], 'color': ['green', 'blue' , 'red', 'green' , 'blue', 'red'], 'val' : [-22.7, -109.6, -57.19, -11.2, -25.6, -33.61]})

    item color val
    book green -22.70
    book blue -109.60
    car red -57.19
    car green -11.20
    bike blue -25.60
    bike red -33.61
    大约有 12,000 行。
    我需要创建一个 numpy 数组,如:
    item    green    blue     red
    book -22.70 -109.60 null
    car -11.20 null -57.19
    bike null -25.60 -33.16
    每行是项目名称,每个列是颜色名称。
    项目和颜色的顺序并不重要。
    但是,在 numpy 数组中,没有行名和列名,我需要保留每个值的项目和颜色名称,以便我知道该值在 numpy 数组中代表什么。
    例如
     how to know that -57.19 is for "car" and "red" in numpy array ? 
    所以,我需要创建一个字典来保持以下之间的映射:
      item <--> row index in the numpy array
    color <--> col index in the numpy array
    我不想使用 iteritems 和 itertuples,因为它们对大型数据帧效率不高,因为 How to iterate over rows in a DataFrame in PandasHow to iterate over rows in a DataFrame in PandasPython Pandas iterate over rows and access column namesDoes pandas iterrows have performance issues?
    为此,我更喜欢 numpy 矢量化解决方案。
    如何有效地将 Pandas 数据帧转换为 numpy 数组?
    该数组也将转换为 torch.tensor。
    谢谢

    最佳答案

  • 使用以下选项之一通过“项目”和“颜色”快速搜索 val:
  • 使用 pandas Boolean indexing
  • 将数据帧转换为 numpy.recarry 使用 pandas.DataFrame.to_records ,并且还使用 bool 索引

  • .itempandas 的方法和 numpy ,所以不要使用 'item'作为列名。已更改为 '_item' .
  • 仅供引用,numpypandas依赖性,以及大部分 pandas矢量化功能直接对应numpy .

  • import pandas as pd
    import numpy as np

    # test data
    df = pd.DataFrame({'_item': ['book', 'book' , 'car', 'car', 'bike', 'bike'], 'color': ['green', 'blue' , 'red', 'green' , 'blue', 'red'], 'val' : [-22.7, -109.6, -57.19, -11.2, -25.6, -33.61]})

    # Use pandas Boolean index to
    selected = df[(df._item == 'book') & (df.color == 'blue')]

    # print(selected)
    _item color val
    book blue -109.6

    # Alternatively, create a recarray
    v = df.to_records(index=False)

    # display(v)
    rec.array([('book', 'green', -22.7 ), ('book', 'blue', -109.6 ),
    ('car', 'red', -57.19), ('car', 'green', -11.2 ),
    ('bike', 'blue', -25.6 ), ('bike', 'red', -33.61)],
    dtype=[('_item', 'O'), ('color', 'O'), ('val', '<f8')])

    # search the recarray
    selected = v[(v._item == 'book') & (v.color == 'blue')]

    # print(selected)
    [('book', 'blue', -109.6)]
    更新以响应 OP 编辑
  • 您必须首先使用 pandas.DataFrame.pivot reshape 数据框,然后使用前面提到的方法。

  • dfp = df.pivot(index='_item', columns='color', values='val')

    # display(dfp)
    color blue green red
    _item
    bike -25.6 NaN -33.61
    book -109.6 -22.7 NaN
    car NaN -11.2 -57.19

    # create a numpy recarray
    v = dfp.to_records(index=True)

    # display(v)
    rec.array([('bike', -25.6, nan, -33.61),
    ('book', -109.6, -22.7, nan),
    ('car', nan, -11.2, -57.19)],
    dtype=[('_item', 'O'), ('blue', '<f8'), ('green', '<f8'), ('red', '<f8')])

    # select data
    selected = v.blue[(v._item == 'book')]

    # print(selected)
    array([-109.6])

    关于python - 如何将 Pandas 数据框转换为带有列名的 numpy 数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64839600/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com