簡體   English   中英

python:在塊中讀取csv時將pandas分類值轉換為整數

[英]python: convert pandas categorical values to integer when reading csv in chunks

我有一個包含 1000 列的大型 csv 文件,第 0 列是一個 id,其他列是分類的。 我想將它們轉換為整數值,以便將它們用於數據分析。 如果我有足夠的內存,第一個“虛擬”方式將起作用:

filename_cat_train = "../input/train_categorical.csv"
df = pd.read_csv(filename_cat_train, dtype=str)

for column in df.columns[1:]:
    df[column] = df[column].astype('category')

columns = df.select_dtypes(['category']).columns
df[columns] = df[columns].apply(lambda x: x.cat.codes)

df.to_csv("../input/train_categorical_rawconversion.csv", index=False)

但它持續很長時間,絕對不是解決任務的聰明方法。

我可以將數據文件分塊加載,然后在使用上述方法轉換為 int 值后進行組合。 但是,當分塊加載時(甚至 100k 大),並非所有類別都存在於我的數據中。 這意味着,在第一個塊中具有值 T10、T11、T13,在第二個塊中具有 T10、T11、T12,對於塊中的類別出現不同的值。

對我來說最好的方法是: 0. 創建分類和相應 int 值的列表(只有 100 個,並且很容易從數據中檢索它們) 1. 分塊加載數據 2. 替換來自列表 3. 保存每個塊並將它們組合起來。

我怎樣才能有效地執行這些步驟? 也許存在更好的方法? 謝謝!

Update1:相同類型的分類數據。 它們是 T12、T45689、A3333 等鍵。 csv 文件是這樣的:4、、、、、T12、、、、、、A44、、、、、、B3333、

在這種情況下,兩遍方案似乎確實有效。

從...開始

import pandas as pd
data=pd.read_csv(my_file_name, chunksize=my_chunk_size)

你可以這樣做:

import collections
uniques = collections.defaultdict(list)
for chunk in data: 
    for col in chunk:
        uniques[col].update(chunk[col].unique())

此時,uniques 應該將每個列名稱映射到其中出現的唯一項。 要轉換為地圖,您現在可以使用

for col in uniques:
   uniques[col] = dict((e[1], e[0]) for e in enumerate(uniques[col]))

現在再次讀取文件,並使用對應的地圖翻譯每一列(請參閱此處。)


如果您的列都包含來自“同一字典”的鍵,您可以執行以下操作:

從以下開始

import pandas as pd
data=pd.read_csv(my_file_name, chunksize=my_chunk_size)

你可以這樣做:

uniques = set([])
for chunk in data: 
    for col in cols:
        uniques.update(chunk[col].unique())

此時,uniques 應該包含出現在 DataFrame 中的唯一項。 要轉換為地圖,您現在可以使用

uniques = dict((e[1], e[0]) for e in enumerate(uniques))

現在,再次加載 DataFrame,並使用pd.DataFrame.replace

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM