[英]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.