csv 使用pyarrow加载“透视”数据(或者,使用pyarrow.Table加载“堆栈”或“融化”)

flseospp  于 2023-01-28  发布在  其他
关注(0)|答案(1)|浏览(179)

我有"透视"格式的大CSV文件:行和列是分类的,而值是同类数据类型。
将这样一个文件加载到一个具有"非透视"模式的pyarrow.Table中的最佳方法是什么(内存和计算效率)?换句话说,给定一个具有n行和m列的CSV文件,如何得到一个具有n*m行和一列的pyarrow.Table
pandas而言,我想我想要pyarrow相当于pandas.DataFrame.melt().stack()
比如说...

  • 给定此CSV文件
item,A,B
item_0,0,0
item_1,370,1
item_2,43,0
  • 我要这个pyarrow.Table
item    group  value
item_0        A      0
item_0        B      0
item_1        A    370
item_1        B      1
item_2        A     43
item_2        B      0
iqjalb3h

iqjalb3h1#

Pyarrow的计算能力有限,目前还不支持melt。你可以看到它提供了什么:https://arrow.apache.org/docs/python/api/compute.html#
另一种方法是自己创建融化的表:

table = pyarrow.csv.read_csv("data.csv")
tables = []
for column_name in table.schema.names[1:]:
    tables.append(pa.Table.from_arrays(
        [
            table[0],
            pa.array([column_name]*table.num_rows, pa.string()),
            table[column_name],
        ],
        names=[
            table.schema.names[0],
            "key",
            "value"
        ]
    
    ))
    
result = pa.concat_tables(tables)

另一个选择是使用pola-rs,它类似于panda,但使用arrow作为后端,与pyarrow不同,它有更多的计算功能,包括melt:https://pola-rs.github.io/polars/py-polars/html/reference/dataframe/api/polars.DataFrame.melt.html

相关问题