如何在python中将数据帧的邮政编码排序为货运区域



基本上,我有一个带有邮政编码列表的pandas数据帧(来自CSV(。现在我需要将它们分类到由各个范围定义的相应货运区域中,下面给出了一个示例。我总共有126个邮政编码范围需要定义,但为了简单起见,我正在缩短它们。

例如
货运区1:邮政编码10000-19999、40000-49999
货物区2:邮政编码30000-39999、60000-69999
货运区3:邮政编码20000-29999、50000-59999
1货运区4:邮政编码00000-09999、70000-79999
2未知货运区:所有其他邮政编码。

将CSV的邮政编码分类到上述货运区域的好方法是什么?

我已经尝试过用for循环和switch语句迭代我的数据帧的所有1500个条目。但它似乎并不有效。

此外,我尝试使用pd.cut((,但总是出现以下错误:ValueError:bin必须单调增加。

箱子是按升序排序的,我通过在excel中排序并再次复制来重新检查它们。

你将如何面对这样的问题?

我不是在寻找一个完整的代码,只是想找到一些想法来解决排序到各个范围的问题。我想避免有一个包含10000个邮政编码的庞大列表,因为申请更改会很烦人,而且这将是一个很大的列表。

编辑:样本数据:

ID,邮政编码
PD000114989
PD000235345
PDF 000323619
PD 00041456
PDF 000593451
PD 000623112
Pd000759838
Pd00089445
PD-000923119
PD-001068990

这是一个简单的CSV,遗憾的是我无法上传文件本身。客户数据本身更复杂,但我已经在缩短它了

pd.cutfillna一起使用

bins = [0, 10000, 20000, 30000, 40000, 50000, 60000, 70000, 80000]
labels = ['Area 4', 'Area 1', 'Area 3', 'Area 2', 'Area 1', 'Area 3', 'Area 2', 'Area 4']
df['frieght_area'] = pd.cut(
df.zip,
bins,
labels=labels,
ordered=False,
include_lowest=True,
right=False
)
df['frieght_area'] = df.frieght_area.cat.add_categories('Unknown').fillna('Unknown')

输出

ID    zip frieght_area
0  PD0001  14989       Area 1
1  PD0002  35345       Area 2
2  PD0003  23619       Area 3
3  PD0004   1456       Area 4
4  PD0005  93451      Unknown
5  PD0006  23112       Area 3
6  PD0007  59838       Area 3
7  PD0008   9445       Area 4
8  PD0009  23119       Area 3
9  PD0010  68990       Area 2

注意:另外,使用Python关键字作为列名也不是一个好主意。使用zip_code而不是zip

我认为在这种情况下,应该使用IntervalIndex进行剪切,得到一个Categorical,然后可以映射到标签。不幸的是,你必须手动输入126个bin定义(除非你能以某种方式解析PDF(,但假设你把你所拥有的转换成这样的形式:

bins = pd.IntervalIndex.from_tuples([
(10000, 19999), (40000, 49999),
(30000, 39999), (60000, 69999),
(20000, 29999), (50000, 59999), 
(0, 9999), (70000, 79999)])
labels = ['Area 1', 'Area 1', 
'Area 2', 'Area 2', 
'Area 3', 'Area 3', 
'Area 4', 'Area 4']

然后假设你的数据看起来像:

df = pd.DataFrame({'zip_code': ['14989', '35345', '23619', '01456', '93451', '23112', '59838', '09445', '23119', '68990']})

你可以这样得到他们所有人的区域:

df['area'] = pd.cut(df['zip_code'].astype(int), bins).map(dict(zip(bins, labels)))

说明:IntervalIndex不需要排序,可以处理间隔中的间隙(将是NaN(。类别是区间,因此我们将它们映射到interval: freight code的字典中,以获得所需的输出。

输出:

zip_code    area
0   14989   Area 1
1   35345   Area 2
2   23619   Area 3
3   01456   Area 4
4   93451   NaN
5   23112   Area 3
6   59838   Area 3
7   09445   Area 4
8   23119   Area 3
9   68990   Area 2

最新更新