基本上,我有一个带有邮政编码列表的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.cut
与fillna
一起使用
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