如何从csv/tsv加载Pandas数据帧作为factorize类别类型?

2024-09-28 17:26:27 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个巨大的TSV(基因组)数据集(1GB大小),它有2504行和220001列。(加载pd.read_table("biallelic-only.raw")需要1小时11分钟4秒

除了5列之外,所有的列都是分类数据,我想将它们转换为factorize category

对于小样本,此代码很好地解决了以下问题:

data = pd.read_table("biallelic-only.raw")
categorical_feats = [
    f for f in data.columns if f not in ['FID', 'IID', 'PAT', 'MAT', 'bmi']
]

categorical_feats
for f in categorical_feats:
    data[f], _ = pd.factorize(data[f])
    data[f] = data[f].astype('category')

但是这个巨大的需要很长时间

我的问题是,是否可以将数据集作为factoriezed类别加载,而不是稍后将其转换

我知道我们可以这样做:

pd.read_csv('file', dtype={'col_name':type}))

但是,考虑到我有220001列,不可能将所有列都设置为一个数据类型字典。我想知道是否有一种倒置的类型分配方式。类似于:将所有列设置为category,除了这5列)

谢谢


Tags: 数据inonlyforreaddatarawtsv
1条回答
网友
1楼 · 发布于 2024-09-28 17:26:27

以分类方式读取数据,并为异常列指定转换器,例如,假设名为'data.csv'的玩具文件包含以下数据:

name  type   cost
AB     B      1
CV     G      4
54     B      31
AB     B      2

你可以做:

import pandas as pd

df = pd.read_csv('data.csv', dtype='category', converters={'cost': int}, delim_whitespace=True)
print(df.dtypes)

输出

name    category
type    category
cost       int64
dtype: object

在上面的例子中,cost是exception列,在您的例子中,它应该是['FID', 'IID', 'PAT', 'MAT', 'bmi']。请注意,转换器字典将取决于您的数据类型(在示例中cost是一个整数列)

相关问题 更多 >