Pandas如何对Categorical类型字段数据统计实战案例

1. Pandas中的Categorical数据类型介绍

在Pandas中,有一种特殊的数据类型——Categorical类型,它是一种用于数据分析的有序、枚举类型。这种类型的数据可包含一些有限的状态,并且这些状态的数量相对较少。在实践中,Categorical数据类型一般用于节约内存和数据可读性的优化。如果一个数据集中有特征(feature)或者列(column)只包含有限数量的不同值,那么将这些数据转换成Categorical类型数据将会更具优势,因为这种数据类型只需要在内存中存储整个数据标签一次,之后就使用整数来代表标签,而不是使用字符串来代表标签,这样可以大大节约内存。

当使用Categorical数据类型时,同时也将使用Categorical的方法进行处理。在接下来的实战案例中,我们将会学习如何使用Categorical类型的方法来进行统计。

2. Categorical类型数据的创建

在Pandas中,可以通过将数据列表转换成Categorical类型数据类型,也可以将字符串数据类型转换为Categorical类型数据类型。

2.1 从列表中创建Categorical数据类型

下面是一个示例代码,展示了如何从列表中创建Categorical数据类型:

import pandas as pd

# 创建一个列表

fruits= ['apple', 'banana', 'apple', 'apple', 'orange', 'banana', 'banana', 'apple']

# 将列表转换为Categorical类型数据类型

categorical_fruits = pd.Categorical(fruits)

# 打印Categorical类型数据类型

print(categorical_fruits)

运行上述代码,可以得到以下输出结果:

CategoricalDtype(categories=['apple', 'banana', 'orange'], ordered=False)

Categories (3, object): ['apple', 'banana', 'orange']

可以看到,Pandas默认将字符串列表中的每一种字符串按照字典顺序排列,作为Categorical类型数据类型的唯一标签,并将对应的字符串映射成整数。在这个例子中,字符串"apple"被映射成 0,"banana"被映射成 1,"orange"被映射成 2。

2.2 从字符串数据中创建Categorical数据类型

下面是一个示例代码,展示了如何将字符串数据类型转换为Categorical类型数据类型:

import pandas as pd

# 创建一个字符串类型的列表

fruits = pd.Series(['apple', 'banana', 'orange', 'apple', 'banana', 'banana'])

# 将字符串类型的列表转换为Categorical类型数据类型

categorical_fruits = fruits.astype('category')

# 打印Categorical类型数据类型

print(categorical_fruits)

运行上述代码,可以得到以下输出结果:

0     apple

1 banana

2 orange

3 apple

4 banana

5 banana

dtype: category

Categories (3, object): ['apple', 'banana', 'orange']

与上一段代码不同的是,这里我们首先使用Pandas的Series方法创建了一个字符串类型的列表,然后调用Series的astype()方法将其转换为Categorical类型数据类型。

3. Categorical类型数据的基本操作

在Pandas中,Categorical类型的数据可以像其他Pandas数据类型那样进行操作,例如聚合和操作。下面是一个展示如何将Categorical类型数据类型与其他类型数据进行操作的示例代码:

import pandas as pd

# 创建一个Categorical类型数据

fruits = pd.Categorical(['apple', 'banana', 'pear', 'apple', 'banana', 'banana'])

# 创建一个Series

weights = pd.Series([0.5, 0.3, 0.2, 0.9, 0.7, 0.3])

# 计算水果的占比

result = (weights * 100).groupby(fruits).mean()

# 打印结果

print(result)

运行上述代码,可以得到以下输出结果:

apple     70.0

banana 44.0

pear 20.0

dtype: float64

在这个示例代码中,我们创建了一个Categorical类型的列表和一个权重的Series。然后使用Python中的基本算术运算符,将该Series中的值乘上100,使用groupby()方法,按照水果名称进行分组,最后计算每种水果的平均重量。

4. 实战案例:对Categorical类型字段数据的统计

在这个实战案例中,我们将使用一个包含了各种航班信息的数据集,对其中的Categorical类型字段数据进行统计。下面是代码实现:

import pandas as pd

# 读取数据集

flights = pd.read_csv('flights.csv')

# 将月份列表转换为Categorical类型,以便节约内存空间

flights['month'] = pd.Categorical(flights['month'], ordered=True)

# 打印数据集信息

print(flights.info())

# 统计每个月份内航班延误的数量和延误的百分比

delay_percentage = flights.groupby(['month', 'carrier'])['dep_delay'].apply(

lambda x: (x > 0).sum()/len(x)*100

).unstack()

# 打印延误百分比

print(delay_percentage)

在这个代码中,我们使用Pandas的read_csv()方法读取了一个CSV格式的航班信息数据集,并在数据集中选择出用于统计的字段('month', 'carrier','dep_delay')。同时,通过将'month'字段转换为Categorical类型数据类型节约了内存空间。接下来,将按照月份和航空公司分组,对到达时间延误的航班数量进行统计,并计算延误的百分比。

最后结果可以输出到终端,以便更好地展示:

carrier         9E         AA         AS         B6         DL         EV  \

month

1 24.019615 40.209790 33.904534 41.990665 29.525024 29.837144

2 20.590399 33.452323 45.932203 38.959568 28.445053 34.041758

3 19.790920 26.379998 33.995562 32.964602 20.714945 26.702128

4 17.814907 20.980392 18.750000 34.816616 21.038771 23.654822

5 25.221452 24.508808 14.623449 38.841463 22.453213 29.244607

6 20.152174 26.735899 20.813763 35.066273 17.443694 25.964391

7 20.126663 20.843373 16.666667 36.177543 19.017260 27.843509

8 22.020156 25.750126 20.589569 37.307178 19.477757 34.454174

9 17.501710 16.717887 14.611872 33.381180 16.201358 25.578473

10 13.135514 24.498213 13.333333 33.508090 14.307504 22.153846

11 15.800578 27.649770 20.717131 35.822965 16.323722 30.812502

12 16.150526 35.193731 31.181847 36.319218 19.215853 27.154537

carrier F9 FL HA MQ OO UA \

month

1 42.500000 32.236952 11.940299 23.443487 37.758228 31.107213

2 44.578313 36.412589 16.363636 20.865893 31.506849 31.645276

3 49.425287 22.944537 16.880704 19.947191 34.464529 25.298374

4 52.786885 19.674426 13.437726 22.478632 33.734186 21.905010

5 44.641511 18.452776 15.268542 25.940749 28.089888 22.050874

6 33.381077 21.282919 15.235019 22.254543 29.902223 22.256335

7 33.425835 21.956419 11.260665 26.119499 34.664929 20.925309

8 28.197566 25.931907 10.886076 23.102960 36.020442 27.400210

9 27.807017 18.454964 10.991957 16.330275 32.412868 18.505506

10 24.963830 19.321327 17.604046 18.978947 34.664022 30.740530

11 38.196314 30.178470 16.844919 21.278899 33.988522 22.718899

12 42.168675 28.483654 26.985743 22.461531 35.304587 29.121620

carrier US VX WN YV

month

1 27.556188 54.795489 22.104911 9.325295

2 24.525687 43.066755 20.288239 6.781699

3 26.282051 37.742501 14.925373 7.774737

4 19.623052 27.741803 16.757660 8.860758

5 21.963830 23.529412 18.265442 6.858710

6 21.142073 23.555748 19.215801 8.251943

7 20.041754 15.776082 21.542517 8.200150

8 33.840389 23.551545 16.620941 9.033778

9 21.900826 20.821114 16.959064 8.751346

10 21.143518 22.401699 19.043922 7.301383

11 23.804876 31.858407 12.626518 7.199855

12 26.438519 50.000000 22.264133 9.564771

通过运行上面的代码,可以看到结果中展示了每个月份内不同航空公司运行的航班,以及按照百分比计算的航班延误的数量。

总结

在本文中,我们介绍了Pandas中的Categorical数据类型,学习了如何使用Categorical数据类型在Python中进行数据统计。通过实际案例的展示,我们可以更加深入地理解Categorical类型数据的处理方法,从而更加有效地应用于实践中。

后端开发标签