转换 Pandas 数据框中的分类数据

2025-03-13 09:17:00
admin
原创
6
摘要:问题描述:我有一个包含以下类型数据的数据框(列太多):col1 int64 col2 int64 col3 category col4 category col5 category 列如下所示:Name: col3, dtype: cate...

问题描述:

我有一个包含以下类型数据的数据框(列太多):

col1        int64
col2        int64
col3        category
col4        category
col5        category

列如下所示:

Name: col3, dtype: category
Categories (8, object): [B, C, E, G, H, N, S, W]

我想将每列中的所有值转换为整数,如下所示:

[1, 2, 3, 4, 5, 6, 7, 8]

我通过以下方法解决了一列的问题:

dataframe['c'] = pandas.Categorical.from_array(dataframe.col3).codes

现在我的数据框中有两列 - 旧列col3和新列c,需要删除旧列。

这是不好的做法。虽然可以,但我的数据框中有太多列,我不想手动执行。

我怎样才能更巧妙地做到这一点?


解决方案 1:

首先,要将分类列转换为其数字代码,您可以使用以下方法更轻松地完成此操作:dataframe['c'].cat.codes

此外,可以使用自动选择数据框中具有特定 dtype 的所有列select_dtypes。这样,您可以在多个自动选择的列上应用上述操作。

首先制作一个示例数据框:

In [75]: df = pd.DataFrame({'col1':[1,2,3,4,5], 'col2':list('abcab'),  'col3':list('ababb')})

In [76]: df['col2'] = df['col2'].astype('category')

In [77]: df['col3'] = df['col3'].astype('category')

In [78]: df.dtypes
Out[78]:
col1       int64
col2    category
col3    category
dtype: object

然后通过使用select_dtypes选择列,然后.cat.codes对每一列应用,您可以得到以下结果:

In [80]: cat_columns = df.select_dtypes(['category']).columns

In [81]: cat_columns
Out[81]: Index([u'col2', u'col3'], dtype='object')

In [83]: df[cat_columns] = df[cat_columns].apply(lambda x: x.cat.codes)

In [84]: df
Out[84]:
   col1  col2  col3
0     1     0     0
1     2     1     1
2     3     2     0
3     4     0     1
4     5     1     1

笔记:

  1. NaN 变成 -1

  2. 该方法速度很快,因为代码和类别之间的关系很容易获得,不需要计算。

解决方案 2:

这对我有用:

pandas.factorize( ['B', 'C', 'D', 'B'] )[0]

输出:

[0, 1, 2, 0]

解决方案 3:

如果您只是担心创建额外的列并在以后将其删除,那么首先不要使用新列。

dataframe = pd.DataFrame({'col1':[1,2,3,4,5], 'col2':list('abcab'),  'col3':list('ababb')})
dataframe.col3 = pd.Categorical.from_array(dataframe.col3).codes

你完成了。现在,由于Categorical.from_array已弃用,请Categorical直接使用

dataframe.col3 = pd.Categorical(dataframe.col3).codes

如果你还需要从索引到标签的映射,那么还有更好的方法

dataframe.col3, mapping_index = pd.Series(dataframe.col3).factorize()

查看下面

print(dataframe)
print(mapping_index.get_loc("c"))

解决方案 4:

这里需要转换多个列。因此,我使用的一种方法是..

for col_name in df.columns:
    if(df[col_name].dtype == 'object'):
        df[col_name]= df[col_name].astype('category')
        df[col_name] = df[col_name].cat.codes

这会将所有字符串/对象类型列转换为分类。然后将代码应用于每种类型的类别。

解决方案 5:

我所做的就是,我replace重视。

像这样-

df['col'].replace(to_replace=['category_1', 'category_2', 'category_3'], value=[1, 2, 3], inplace=True)

这样,如果col列具有分类值,它们就会被数值替换。

解决方案 6:

为了转换数据集数据C列中的分类数据,我们需要执行以下操作:

from sklearn.preprocessing import LabelEncoder 
labelencoder= LabelEncoder() #initializing an object of class LabelEncoder
data['C'] = labelencoder.fit_transform(data['C']) #fitting and transforming the desired categorical column.

解决方案 7:

要将 Dataframe 中的所有列转换为数值数据:

df2 = df2.apply(lambda x: pd.factorize(x)[0])

解决方案 8:

这里的答案似乎已经过时了。Pandas 现在有一个factorize()功能,您可以创建以下类别:

df.col.factorize() 

函数签名:

pandas.factorize(values, sort=False, na_sentinel=- 1, size_hint=None)

解决方案 9:

将分类变量转换为虚拟变量/指示变量的最简单方法之一是使用pandas 提供的get_dummies。例如,我们有一个数据,其中sex包含分类值(男性和女性),您需要将其转换为虚拟变量/指示变量,下面是如何操作的。

tranning_data = pd.read_csv("../titanic/train.csv")
features = ["Age", "Sex", ] //here sex is catagorical value
X_train = pd.get_dummies(tranning_data[features])
print(X_train)

Age Sex_female Sex_male
20    0          1
33    1          0
40    1          0
22    1          0
54    0          1

运行代码片段Hide results展开片段

解决方案 10:

你可以使用.replace如下方法:

df['col3']=df['col3'].replace(['B', 'C', 'E', 'G', 'H', 'N', 'S', 'W'],[1,2,3,4,5,6,7,8])

或者.map

df['col3']=df['col3'].map({1: 'B', 2: 'C', 3: 'E', 4:'G', 5:'H', 6:'N', 7:'S', 8:'W'})

解决方案 11:

categorical_columns =['sex','class','deck','alone']

for column in categorical_columns:
     df[column] = pd.factorize(df[column])[0]

因式分解将把列中每个唯一的分类数据分解为一个特定的数字(从 0 到无穷大)。

解决方案 12:

@Quickbeam2k1,见下文 -

dataset=pd.read_csv('Data2.csv')
np.set_printoptions(threshold=np.nan)
X = dataset.iloc[:,:].values

使用 sklearn在此处输入图片描述

from sklearn.preprocessing import LabelEncoder
labelencoder_X=LabelEncoder()
X[:,0] = labelencoder_X.fit_transform(X[:,0])

解决方案 13:

你可以用更少的代码来完成如下操作:

f = pd.DataFrame({'col1':[1,2,3,4,5], 'col2':list('abcab'),'col3':list('ababb')})

f['col1'] =f['col1'].astype('category').cat.codes
f['col2'] =f['col2'].astype('category').cat.codes
f['col3'] =f['col3'].astype('category').cat.codes

f

在此处输入图片描述

解决方案 14:

只需使用手动匹配:

dict = {'Non-Travel':0, 'Travel_Rarely':1, 'Travel_Frequently':2}

df['BusinessTravel'] = df['BusinessTravel'].apply(lambda x: dict.get(x))

解决方案 15:

对于某一列,如果你不关心顺序,请使用此

df['col1_num'] = df['col1'].apply(lambda x: np.where(df['col1'].unique()==x)[0][0])

如果你关心顺序,请将它们指定为列表并使用此

df['col1_num'] = df['col1'].apply(lambda x: ['first', 'second', 'third'].index(x))

解决方案 16:

你可以使用类似这样的东西

df['Grade'].replace(['A', 'B', 'C'], [0, 1, 2], inplace=True)

如果这样,请使用 inplace 参数,这样您就不执行复制。您选择一个列并用您想要的列替换那里的不同列。

相关推荐
  政府信创国产化的10大政策解读一、信创国产化的背景与意义信创国产化,即信息技术应用创新国产化,是当前中国信息技术领域的一个重要发展方向。其核心在于通过自主研发和创新,实现信息技术应用的自主可控,减少对外部技术的依赖,并规避潜在的技术制裁和风险。随着全球信息技术竞争的加剧,以及某些国家对中国在科技领域的打压,信创国产化显...
工程项目管理   1554  
  为什么项目管理通常仍然耗时且低效?您是否还在反复更新电子表格、淹没在便利贴中并参加每周更新会议?这确实是耗费时间和精力。借助软件工具的帮助,您可以一目了然地全面了解您的项目。如今,国内外有足够多优秀的项目管理软件可以帮助您掌控每个项目。什么是项目管理软件?项目管理软件是广泛行业用于项目规划、资源分配和调度的软件。它使项...
项目管理软件   1353  
  信创国产芯片作为信息技术创新的核心领域,对于推动国家自主可控生态建设具有至关重要的意义。在全球科技竞争日益激烈的背景下,实现信息技术的自主可控,摆脱对国外技术的依赖,已成为保障国家信息安全和产业可持续发展的关键。国产芯片作为信创产业的基石,其发展水平直接影响着整个信创生态的构建与完善。通过不断提升国产芯片的技术实力、产...
国产信创系统   3  
  信创生态建设旨在实现信息技术领域的自主创新和安全可控,涵盖了从硬件到软件的全产业链。随着数字化转型的加速,信创生态建设的重要性日益凸显,它不仅关乎国家的信息安全,更是推动产业升级和经济高质量发展的关键力量。然而,在推进信创生态建设的过程中,面临着诸多复杂且严峻的挑战,需要深入剖析并寻找切实可行的解决方案。技术创新难题技...
信创操作系统   6  
  信创产业作为国家信息技术创新发展的重要领域,对于保障国家信息安全、推动产业升级具有关键意义。而国产芯片作为信创产业的核心基石,其研发进展备受关注。在信创国产芯片的研发征程中,面临着诸多复杂且艰巨的难点,这些难点犹如一道道关卡,阻碍着国产芯片的快速发展。然而,科研人员和相关企业并未退缩,积极探索并提出了一系列切实可行的解...
国产化替代产品目录   6  
热门文章
项目管理软件有哪些?
云禅道AD
禅道项目管理软件

云端的项目管理软件

尊享禅道项目软件收费版功能

无需维护,随时随地协同办公

内置subversion和git源码管理

每天备份,随时转为私有部署

免费试用