pandas 使用 parquet 的群体的奇怪行为

jgovgodb  于 2023-02-17  发布在  其他
关注(0)|答案(1)|浏览(98)

我有一个df.columns=['ID','Month','Characteristic','Value']的 Dataframe df,我想知道子集=['ID','Month','Characteristic']有多少个值a,所以我首先创建了一个新列df ['Count']=1,然后应用

db=df.groupby(['ID','Month','Characteristic']['Count'].sum()
db=db.to_frame()
db=db.reset_index()

奇怪的是,如果我上传df作为 parquet 使用:

import pyarrow.parquet as pq
_table = (pq.ParquetFile(path)
            .read(use_pandas_metadata=True))
df = _table.to_pandas(strings_to_categorical=True)

当我计算db的时候,它给了我一个内存错误,因为它创建了所有可能的组合:例如,即使ID 1在月份M1中不具有特性C1(单位:db),我也会获得如下行:
| 识别号|特征c|月份|计数|
| - ------|- ------|- ------|- ------|
| 识别码1|C1|M1|无|
我说这很奇怪,因为如果我先把 parquet 保存为csv,然后上传这个csv,它会给我正确的结果,所以在这种情况下,没有零计数的线条。你有什么想法吗?

dbf7pr2w

dbf7pr2w1#

你的问题来自于使用了绝对性。
因为在加载数据时使用strings_to_categorical=True,所以group by的行为会发生变化,为每个可能的ID/Characteristic/Month生成一个条目。
您可以停止使用strings_to_categorical=True,但这将增加程序的内存使用。
或者,您可以更改分组依据,仅显示“观察”值:

table.to_pandas(strings_to_categorical=True).groupby(['ID','Month','Characteristic'], as_index=False, observed=True).size()

相关问题