问题的提出和解决方案概述
这篇文章将告诉你如何找到Pandas列中最常见的元素。
为了使它更有趣,我们有以下运行场景。
你得到了一个可下载的CSV文件,其中包含圣地亚哥地区的犯罪统计数据,包括其各自的NCIC犯罪代码。
问题是:你如何确定发生在圣地亚哥辖区的最常见的NCIC犯罪代码?
我们可以通过以下方案之一来完成这项任务。
- 方法1 :使用潘达
mode() - 方法2 :使用Pandas
value_counts() - 方法3 :使用
value_counts()和idxmax() - 方法4:使用
value_counts()和keys() - ** 方法5**:使用潘达
groupby()
准备工作
在前进之前,请确保Pandas库已经安装。
然后,在每个脚本的顶部添加以下代码。这段代码将使本文中的代码能够无误运行。
import pandas as pd
方法1:使用潘达斯模式()
这个例子使用 mode()方法来确定某一天在圣地亚哥发生的最常见的犯罪。
df = pd.read_csv('crimes.csv', usecols=['crimedescr'])
max_crime = df['crimedescr'].mode()
print(max_crime)
上面的代码从之前下载的crimes.csv文件中读入crimedescr 列。这将保存到DataFramedf 。
接下来,crimedescr 列被访问,然后将 mode()方法被追加。这个方法返回一个沿选定轴线最常出现的值或一组值。结果保存到max_crime 。
这些结果被输出到终端。
0 10851(A)VC TAKE VEH W/O OWNER |
因此,在圣地亚哥某天发生的7854行犯罪中,上述犯罪的次数最多。
上述代码只为我们提供了最常见的犯罪行为的名称,如果我们需要犯罪行为的名称和各自的次数呢?
df = pd.read_csv('crimes.csv', usecols=['crimedescr', 'ucr_ncic_code'])
max_crime = df['crimedescr'].mode()
max_count = df['ucr_ncic_code'].mode()
print(max_crime)
print(max_count)
上述代码被输出到终端,显示如下。
0 10851(A)VC TAKE VEH W/O OWNER |
现在,你有能力回到你的老板那里,告诉他们在圣地亚哥的某一天发生了7000起10851(A)VC TAKE VEH W/OWNER的罪行。
方法2:使用value_counts()
这个例子使用 value_counts()函数来确定某一天在圣地亚哥发生的最常见的5种罪行。
df = pd.read_csv('crimes.csv', usecols=['crimedescr', 'ucr_ncic_code'])
top5_names = df['crimedescr'].value_counts()[:5].index.tolist()
print(top5_names)
上面的代码从前面下载的crimes.csv文件中读入crimedescr 和ucr_ncic_code 列。这将保存到DataFramedf 。
然后,访问crimedescr 列,并将 [](https://blog.finxter.com/pandas-dataframe-mode-method/)[value_counts()](https://blog.finxter.com/how-to-count-occurrences-of-elements-in-pandas/)函数被追加。该函数返回一个包含唯一值计数的系列。
但是,由于还附加了切片([:5] ),所以只检索了前五(5)种常见的犯罪,然后转换为一个列表。结果保存在top5_names 。
['10851(A)VC TAKE VEH W/O OWNER', 'TOWED/STORED VEH-14602.6', '459 PC BURGLARY VEHICLE', 'TOWED/STORED VEHICLE', '459 PC BURGLARY RESIDENCE'] |
上面的代码只为我们提供了最常见的前5种罪行的名称,如果我们需要这些名称和它们各自的数量呢?
df = pd.read_csv('crimes.csv', usecols=['crimedescr', 'ucr_ncic_code'])
top5 = df['crimedescr'].value_counts()[:5].sort_values(ascending=False)
print(top5)
上面的输出被发送到终端。
| 10851(a)VC在没有车主的情况下拿走车辆 | 653 |
| 被拖走/存放的车辆-14602.6 | 463 |
| 459 PC入室盗窃车辆 | 462 |
| 被拖走/存放的车辆 | 434 |
| 459 pc 盗窃住宅 | 356 |
| 名称: crimedescr, dtype: int64 |
要达到同样的结果,一个更简洁的方法是使用以下代码。
df = pd.read_csv('crimes.csv', usecols=['crimedescr', 'ucr_ncic_code'])
top5 = df['crimedescr'].value_counts().nlargest(5)
print(top5)
上面的代码调用 nlargest()方法来确定和检索前五(5)种常见犯罪。其输出结果与上述内容相同。
| 10851(a)VC夺取无主车辆 | 653 |
| 被拖走/存放的车辆-14602.6 | 463 |
| 459 PC入室盗窃车辆 | 462 |
| 被拖走/存放的车辆 | 434 |
| 459 pc 盗窃住宅 | 356 |
| 名称: crimedescr, dtype: int64 |
一个更干净、更精确的输出结果,可以发给老板了
方法3:使用value_counts()和idxmax()
这个例子使用了 value_counts()和 idxmax()来确定某一天在圣地亚哥发生的最常见的单一犯罪。
df = pd.read_csv('crimes.csv', usecols=['crimedescr', 'ucr_ncic_code'])
max_crime = df['crimedescr'].value_counts().idxmax()
print(max_crime)
上面的代码从前面下载的crimes.csv文件中读入crimedescr 和ucr_ncic_code 列。这将保存到DataFramedf 。
然后,crimedescr 列被访问,并将value_counts()函数被附加。这个函数返回一个包含唯一值计数的系列。
下一步。 idxmax()被追加。这个方法返回在一个选定的轴上第一次出现的最大索引(es)的索引。
结果保存到max_crime ,并输出到终端。
10851(A)VC TAKE VEH W/O OWNER |
方法4:使用value_counts() 和 keys()
这个例子使用了 value_counts()和keys()来确定某一天在圣地亚哥独特网格区域内最常见的5种犯罪。
df = pd.read_csv('crimes.csv', usecols=['crimedescr', 'grid', 'ucr_ncic_code'])
top5_grids = df['grid'].value_counts().keys()[:5]
print(top5_grids)
上面的代码从之前下载的crimes.csv文件中读入crimedescr,grid, 和ucr_ncic_code 列。这将保存到DataFramedf 。
让我们把突出显示的这一行分解开来。
如果df['grid'].value_counts() 被输出到终端,将显示以下内容(片段)。然而,我们添加了一个标题行,使其更容易理解,并且只显示五(5)行。
| 网格 # | 网格总数 |
| 742 | 115 |
| 969 | 105 |
| 958 | 100 |
| 564 | 80 |
| 1084 | 71 |
接下来,附加了代码keys()[:5] 。最后的输出显示如下。
Int64Index([742, 969, 958, 564, 1084], dtype='int64') |
方法5:使用groupby()
这个例子使用了 groupby()将我们的数据按犯罪代码分组,并按降序显示总数。
df = pd.read_csv('crimes.csv', usecols=['crimedescr', 'ucr_ncic_code'])
res = (df.groupby(['ucr_ncic_code','crimedescr']).size()
.sort_values(ascending=False)
.reset_index(name='count'))
print(res)
上面的代码从前面下载的crimes.csv文件中读入crimedescr 和ucr_ncic_code 列。这将保存到DataFramedf 。
接下来,该 groupby()函数被调用并传递了第一个参数:df.groupby(['ucr_ncic_code','crimedescr']).size() 。如果此时将其输出到终端,将显示如下内容(片段)。
print(df.groupby(['ucr_ncic_code','crimedescr']).size())
| ucr_ncic_code | 犯罪率 | |
| 909 | 2 | |
| 999 | 1 | |
| 197 | 1 | |
| 664 | 1 | |
| 1099 | 1 |
正如你所看到的,需要添加其他参数才能将其变成可用的东西。将数据按降序排序,并添加一个计数列,将提供我们所要的结果。
如果将原始方法5的代码例子输出到终端,将显示如下。
| ucr_ncic_code | crimedescr | 计数 | |
| 0 | 2404 | 10851(a)VC在没有车主的情况下带走车辆 | 653 |
| 1 | 7000 | 被拖走/存放的车辆-14602.6 | 463 |
| 2 | 2299 | 459 pc 盗窃车辆 | 462 |
| 3 | 7000 | 被拖走/存放的车辆 | 434 |
| 4 | 2204 | 459 pc入室盗窃住宅 | 356 |
摘要
这篇文章提供了(5)种方法来寻找熊猫专栏中最常见的元素。这些例子应该为您提供足够的信息来选择最符合您的编码要求的方法。
祝您好运,编码愉快!