pandas ----数据分类(category)

26 篇文章 3 订阅
7 篇文章 0 订阅

1.category的创建及其性质

这是对pandas分类数据类型的介绍,包括与R的简短比较factor。

category是与统计中分类变量相对应的 pandas数据类型。分类变量具有有限的且通常是固定的数量的可能值(类别;R中的级别)。例子包括性别,社会阶层,血型,国家归属,观察时间或通过李克特量表的评分。

与统计分类变量相比,category数据可能具有顺序(例如“强烈同意”与“同意”或“第一次观察”与“第二次观察”),但是数字运算(加法,除法……)是不可能的。

category数据的所有值都在类别或np.nan中。顺序由类别的顺序定义,而不是值的词汇顺序。在内部,该数据结构由一个的类别阵列和的整数数组码,其指向在现实值的类别阵列。

1.1. 分类变量的创建

(a)用Series创建

pd.Series(["a", "b", "c", "a"], dtype="category")
0    a
1    b
2    c
3    a
dtype: category
Categories (3, object): [a, b, c]

(b)对DataFrame指定类型创建

temp_df = pd.DataFrame({'A':pd.Series(["a", "b", "c", "a"], dtype="category"),'B':list('abcd')})
temp_df.dtypes
A    category
B      object
dtype: object

(c)利用内置Categorical类型创建

cat = pd.Categorical(["a", "b", "c", "a"], categories=['a','b','c'])
pd.Series(cat)
0    a
1    b
2    c
3    a
dtype: category
Categories (3, object): [a, b, c]

(d)利用cut函数创建
默认使用区间类型为标签

pd.cut(np.random.randint(0,60,5), [0,10,30,60])
[(0, 10], (30, 60], (10, 30], (30, 60], (10, 30]]
Categories (3, interval[int64]): [(0, 10] < (10, 30] < (30, 60]]

可指定字符为标签

pd.cut(np.random.randint(0,60,5), [0,10,30,60], right=False, labels=['0-10','10-30','30-60'])
[10-30, 10-30, 0-10, 10-30, 30-60]
Categories (3, object): [0-10 < 10-30 < 30-60]

1.2. 分类变量的结构

一个分类变量包括三个部分,元素值(values)、分类类别(categories)、是否有序(order)

从上面可以看出,使用cut函数创建的分类变量默认为有序分类变量
下面介绍如何获取或修改这些属性

(a)describe方法
该方法描述了一个分类序列的情况,包括非缺失值个数、元素值类别数(不是分类类别数)、最多次出现的元素及其频数

s = pd.Series(pd.Categorical(["a", "b", "c", "a",np.nan], categories=['a','b','c','d']))
s.describe()
count     4
unique    3
top       a
freq      2
dtype: object

(b)categories和ordered属性
查看分类类别和是否排序

s.cat.categories
Index(['a', 'b', 'c', 'd'], dtype='object')
s.cat.ordered
False
  1. 类别的修改
    (a)利用set_categories修改
    修改分类,但本身值不会变化
s = pd.Series(pd.Categorical(["a", "b", "c", "a",np.nan], categories=['a','b','c','d']))
s.cat.set_categories(['new_a','c'])
0    NaN
1    NaN
2      c
3    NaN
4    NaN
dtype: category
Categories (2, object): [new_a, c]

(b)利用rename_categories修改
需要注意的是该方法会把值和分类同时修改

s = pd.Series(pd.Categorical(["a", "b", "c", "a",np.nan], categories=['a','b','c','d']))
s.cat.rename_categories(['new_%s'%i for i in s.cat.categories])
0    new_a
1    new_b
2    new_c
3    new_a
4      NaN
dtype: category
Categories (4, object): [new_a, new_b, new_c, new_d]

利用字典修改值

s.cat.rename_categories({'a':'new_a','b':'new_b'})
0    new_a
1    new_b
2        c
3    new_a
4      NaN
dtype: category
Categories (4, object): [new_a, new_b, c, d]

(c)利用add_categories添加

s = pd.Series(pd.Categorical(["a", "b", "c", "a",np.nan], categories=['a','b','c','d']))
s.cat.add_categories(['e'])
0      a
1      b
2      c
3      a
4    NaN
dtype: category
Categories (5, object): [a, b, c, d, e]

(d)利用remove_categories移除

s = pd.Series(pd.Categorical(["a", "b", "c", "a",np.nan], categories=['a','b','c','d']))
s.cat.remove_categories(['d'])
0      a
1      b
2      c
3      a
4    NaN
dtype: category
Categories (3, object): [a, b, c]

(e)删除元素值未出现的分类类型

s = pd.Series(pd.Categorical(["a", "b", "c", "a",np.nan], categories=['a','b','c','d']))
s.cat.remove_unused_categories()
0      a
1      b
2      c
3      a
4    NaN
dtype: category
Categories (3, object): [a, b, c]

1.3. 类别的修改

(a)利用set_categories修改
修改分类,但本身值不会变化

s = pd.Series(pd.Categorical(["a", "b", "c", "a",np.nan], categories=['a','b','c','d']))
s.cat.set_categories(['new_a','c'])
0    NaN
1    NaN
2      c
3    NaN
4    NaN
dtype: category
Categories (2, object): [new_a, c]

(b)利用rename_categories修改
需要注意的是该方法会把值和分类同时修改

s = pd.Series(pd.Categorical(["a", "b", "c", "a",np.nan], categories=['a','b','c','d']))
s.cat.rename_categories(['new_%s'%i for i in s.cat.categories])
0    new_a
1    new_b
2    new_c
3    new_a
4      NaN
dtype: category
Categories (4, object): [new_a, new_b, new_c, new_d]

利用字典修改值

s.cat.rename_categories({'a':'new_a','b':'new_b'})
0    new_a
1    new_b
2        c
3    new_a
4      NaN
dtype: category
Categories (4, object): [new_a, new_b, c, d]

(c)利用add_categories添加

s = pd.Series(pd.Categorical(["a", "b", "c", "a",np.nan], categories=['a','b','c','d']))
s.cat.add_categories(['e'])
0      a
1      b
2      c
3      a
4    NaN
dtype: category
Categories (5, object): [a, b, c, d, e]

(d)利用remove_categories移除

s = pd.Series(pd.Categorical(["a", "b", "c", "a",np.nan], categories=['a','b','c','d']))
s.cat.remove_categories(['d'])
0      a
1      b
2      c
3      a
4    NaN
dtype: category
Categories (3, object): [a, b, c]

(e)删除元素值未出现的分类类型

s = pd.Series(pd.Categorical(["a", "b", "c", "a",np.nan], categories=['a','b','c','d']))
s.cat.remove_unused_categories()
0      a
1      b
2      c
3      a
4    NaN
dtype: category
Categories (3, object): [a, b, c]

2.分类变量的排序

分类数据类型被分为有序和无序,例如分数区间的高低是有序变量,考试科目的类别一般看做无序变量

2.1. 序的建立

(a)一般来说会将一个序列转为有序变量,可以利用as_ordered方法

s = pd.Series(["a", "d", "c", "a"]).astype('category').cat.as_ordered()
s
0    a
1    d
2    c
3    a
dtype: category
Categories (3, object): [a < c < d]

退化为无序变量,只需要使用as_unordered

s.cat.as_unordered()
0    a
1    d
2    c
3    a
dtype: category
Categories (3, object): [a, c, d]

(b)利用set_categories方法中的order参数

pd.Series(["a", "d", "c", "a"]).astype('category').cat.set_categories(['a','c','d'],ordered=True)
0    a
1    d
2    c
3    a
dtype: category
Categories (3, object): [a < c < d]

(c)利用reorder_categories方法
这个方法的特点在于,新设置的分类必须与原分类为同一集合

s = pd.Series(["a", "d", "c", "a"]).astype('category')
s.cat.reorder_categories(['a','c','d'],ordered=True)
0    a
1    d
2    c
3    a
dtype: category
Categories (3, object): [a < c < d]
#s.cat.reorder_categories(['a','c'],ordered=True) #报错
#s.cat.reorder_categories(['a','c','d','e'],ordered=True) #报错
  1. 排序
    值排序和索引排序都是适用的
s = pd.Series(np.random.choice(['perfect','good','fair','bad','awful'],50)).astype('category')
s.cat.set_categories(['perfect','good','fair','bad','awful'][::-1],ordered=True).head()
0     good
1     good
2    awful
3     fair
4      bad
dtype: category
Categories (5, object): [awful < bad < fair < good < perfect]
s.sort_values(ascending=False).head()
1    d
2    c
3    a
0    a
dtype: category
Categories (3, object): [a, c, d]
df_sort = pd.DataFrame({'cat':s.values,'value':np.random.randn(50)}).set_index('cat')
df_sort.head()
value
cat
good1.842078
good0.398738
awful0.666697
fair0.136636
bad0.063595
df_sort.sort_index().head()
value
cat
awful0.293804
awful0.737856
awful-0.329468
awful-0.482377
awful-1.762238

3.分类变量的比较操作

3.1. 与标量或等长序列的比较

(a)标量比较

s = pd.Series(["a", "d", "c", "a"]).astype('category')
s == 'a'
0     True
1    False
2    False
3     True
dtype: bool

(b)等长序列比较

s == list('abcd')
0     True
1    False
2     True
3    False
dtype: bool

3.2. 与另一分类变量的比较

(a)等式判别(包含等号和不等号)
两个分类变量的等式判别需要满足分类完全相同

s = pd.Series(["a", "d", "c", "a"]).astype('category')
s == s
0    True
1    True
2    True
3    True
dtype: bool
s != s
0    False
1    False
2    False
3    False
dtype: bool
s_new = s.cat.set_categories(['a','d','e'])
#s == s_new #报错

(b)不等式判别(包含>=,<=,<,>)
两个分类变量的不等式判别需要满足两个条件:
① 分类完全相同
② 排序完全相同

s = pd.Series(["a", "d", "c", "a"]).astype('category')
#s >= s #报错
s = pd.Series(["a", "d", "c", "a"]).astype('category').cat.reorder_categories(['a','c','d'],ordered=True)
s >= s
0    True
1    True
2    True
3    True
dtype: bool
  • 2
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 对于 NSD-KDD 数据集的预处理,可以使用 Python 进行读取和处理。具体代码如下: ``` import pandas as pd # 读取数据 df = pd.read_csv("NSD-KDD.csv") # 清洗数据,删除无用列 df = df.drop(["col1", "col2", ...], axis=1) # 处理缺失值 df = df.fillna(0) # 将类别变量转换为数值变量 df["class"] = df["class"].astype("category").cat.codes # 输出预处理后的数据 print(df) ``` 这仅仅是一个简单的示例, 具体预处理步骤和参数可能需要根据数据集和应用场景进行调整。 ### 回答2: NSL-KDD数据集是一个经典的用于网络入侵检测的数据集,包含了大量的网络流量数据。在进行数据分析之前,我们需要进行数据预处理,以便将数据整理为适合模型训练的格式。这里给出一个使用Python进行NSL-KDD数据预处理的示例代码。 ```python # 导入必要的库 import pandas as pd from sklearn.preprocessing import LabelEncoder # 读取数据集 data = pd.read_csv('path/to/nsl-kdd-dataset.csv') # 删除无关特征 drop_columns = ['duration', 'service', 'flag'] data = data.drop(drop_columns, axis=1) # 对分类变量进行标签编码 cat_columns = ['protocol_type', 'land', 'logged_in', 'is_host_login', 'is_guest_login', 'attack_type'] le = LabelEncoder() for col in cat_columns: data[col] = le.fit_transform(data[col]) # 分离特征和标签 X = data.drop('attack_type', axis=1) y = data['attack_type'] # 划分训练集和测试集 from sklearn.model_selection import train_test_split X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42) # 特征缩放 from sklearn.preprocessing import StandardScaler scaler = StandardScaler() X_train_scaled = scaler.fit_transform(X_train) X_test_scaled = scaler.transform(X_test) # 数据预处理完成,可以进行进一步的模型训练和评估 ``` 以上代码主要包括以下几个步骤: 1. 导入相关库。 2. 读取NSL-KDD数据集。 3. 删除无关特征。 4. 对分类变量进行标签编码。 5. 分离特征和标签。 6. 划分训练集和测试集。 7. 进行特征缩放。 8. 数据预处理完成,可以进行进一步的模型训练和评估。 请注意,上述代码仅为一个示例,实际情况中可能需要根据具体需求进行调整。 ### 回答3: NSL-KDD数据集是一个用于网络入侵检测的公开数据集,其中包含了来自于KDD Cup 1999的网络流量数据。在进行数据分析和建模之前,需要对数据进行预处理。以下是一个使用Python进行NSL-KDD数据预处理的示例代码。 ```python import pandas as pd from sklearn.preprocessing import LabelEncoder, MinMaxScaler # 读取数据集 data = pd.read_csv('KDDTrain+.csv') # 删除无关特征列 data.drop(['symbolic_host', 'service', 'flag'], axis=1, inplace=True) # 将类别标签编码为数字 label_encoder = LabelEncoder() data['label'] = label_encoder.fit_transform(data['label']) # 进行独热编码 data = pd.get_dummies(data, columns=['protocol_type']) # 数据标准化 scaler = MinMaxScaler() data[['duration', 'src_bytes', 'dst_bytes', 'wrong_fragment', 'urgent', 'hot', 'num_failed_logins']] = \ scaler.fit_transform(data[['duration', 'src_bytes', 'dst_bytes', 'wrong_fragment', 'urgent', 'hot', 'num_failed_logins']]) # 将预处理后的数据保存到文件 data.to_csv('preprocessed_data.csv', index=False) ``` 以上代码首先使用`pandas`库读取数据集,然后删除了与预测无关的特征列。接下来,使用`LabelEncoder`将类别标签编码为数字,以便于后续建模。然后,使用`pd.get_dummies()`进行独热编码,将离散特征变为二进制形式。最后,使用`MinMaxScaler`对数值特征进行标准化,将特征值缩放到0-1的范围内。最终,将预处理后的数据保存到文件中。 请注意,上述代码仅为示例,具体的数据预处理过程可能会根据实际情况进行调整。另外,该代码仅对训练数据集进行预处理,对于测试数据集的预处理可类似操作。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值