簡體   English   中英

如何從 pandas DataFrame 中刪除所有分類列?

[英]How to remove all Categorical columns from a pandas DataFrame?

分類列是在 pandas 中保存 memory RAM 的好方法,但是有時它們只會減慢速度。 特別是在您通過了擁有大型 dataframe 並且現在正在一個子集中工作的階段之后。 例如,在 Jupyter 中打印或使用 qgrid 之類的庫時,它似乎並不能很好地發揮作用。

我基本上想從 dataframe 中刪除所有分類列以加快簡單的事情:

這是一個例子:

df = pd.DataFrame({"A": ["a", "b", "c", "a"], 
                   "B": ["a", "b", "c", "a"],
                   "C": [0,3,0,3],
                   "D": [0.2,0.2,0.3,0.3],
                   "F": [0,1,2,3]
                  }
                 )
df["B"] = df["B"].astype('category')
df["C"] = df["C"].astype('category')
df["D"] = df["D"].astype('category')

這導致某些列是分類的(具有不同的類型:int、float、str)。

df.dtypes
A      object
B    category
C    category
D    category
F       int64
dtype: object

理想情況下是這樣的:

df = df.remove_all_categorical_columns();

這將返回原始的基本類型:

df.dtypes
A     object
B     object
C      int64
D    float64
F      int64
dtype: object

您可以使用df['column'].cat.categories.dtype恢復原始數據類型。 rest 是使用df['column']astype(df['column'].cat.categories.dtype)遍歷所有列的問題。

以下內容適用於您的示例(希望對於其他情況足夠通用):

def uncategorize(col):
    if col.dtype.name == 'category':
        try:
            return col.astype(col.cat.categories.dtype)
        except:
            # In case there is pd.NA (pandas >= 1.0), Int64 should be used instead of int64
            return col.astype(col.cat.categories.dtype.name.title())           
    else:
        return col

df = df.apply(lambda x: uncategorize(x), axis=0)

然后,您恢復原始數據類型。

df.dtypes
A     object
B     object
C      int64
D    float64
F      int64
dtype: object

Pandas 內置了這個。

df = df.select_dtypes(exclude=["category"])
df
    A   F
0   a   0
1   b   1
2   c   2
3   a   3

或者使用列表推導查找分類列,然后刪除它們。

cat_cols = [col for col in df.columns if df[col].dtype.name=="category"]
df = df.drop(cat_cols, axis=1)
df
    A   F
0   a   0
1   b   1
2   c   2
3   a   3

暫無
暫無

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

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