如何从csv / tsv加载Pandas DataFrame作为分解类别类型?

问题描述 投票:0回答:2

我有一个庞大的TSV(基因组)数据集(1GB大小),其中包含2,504行和220,001列。 (需要1h 11min 4s来加载pd.read_table("biallelic-only.raw")

所有列,但其中5列都是分类数据,我想将它们转换为分解类别。

对于小样本,此代码可以很好地解决:

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')

但是,对于这个巨大的人来说,它需要很长时间。

我的问题是,是否有可能已经将数据集作为分解类别加载,而不是稍后进行转换?

我知道我们可以做类似的事情:

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

但是,鉴于我有220,001列,因此无法将所有列都设置为dtype字典。我想知道是否存在反向类型分配方式。诸如此类:将除5列之外的所有列都设置为category

谢谢!

python pandas csv dataframe
2个回答
1
投票

例如,按类别读取数据,并为exception列指定一个转换器,例如,假设一个名为'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

在上面的示例中,费用是例外列,在您的情况下,应为['FID', 'IID', 'PAT', 'MAT', 'bmi']。请注意,转换器字典将取决于您的数据类型(在示例中cost是整数列)。


0
投票

用途:

c = ['FID', 'IID', 'PAT', 'MAT', 'bmi']
cols = pd.read_table("biallelic-only.raw", nrows=0).columns

d = dict.fromkeys(cols.difference(c), 'category')
data = pd.read_table("biallelic-only.raw", dtype=d)

cat = list(d.keys())
data[cat] = data[cat].apply(lambda x: x.cat.codes)
© www.soinside.com 2019 - 2024. All rights reserved.