基本上,我有一个熊猫的数据(从一个CSV)与一个邮编列表。现在,我需要将它们分类为相应的货运区,这些货运区是根据不同的范围确定的,下面给出一个例子。总之,我需要定义126个邮政编码范围,但为了简单起见,我正在缩短它们。
例如。
货运区域1:邮政编码10000 - 19999,40000 - 49999
货运区域2:邮政编码30000 - 39999,60000 - 69999
货运区域3:邮政编码20000 - 29999,50000 - 59999
货运区域4:邮政编码00000 - 09999,70000 - 79999
未知货运区域:所有其他邮编。
将CSV的邮政编码分类到所述货运区域的好方法是什么?
我已经尝试过用for循环和switch语句迭代我的dataframe的所有1500个条目。但它似乎不太有效。
另外,我尝试使用pd.cut(),但是我总是得到以下错误: ValueError: bins必须单调增加。
回收箱是在升序中排序的,我通过在excel中对它们进行排序并再次复制它们来重新检查它们。
你将如何面对这样的问题?
我不是在寻找一个完成的代码,只是为了解决个别范围的排序的一些想法。我想避免有一个庞大的清单10.000邮政编码,因为更改将是烦人的应用,这将是一个大名单。
编辑:样本数据:
身份证,拉链
PD0001,14989
PD0002,35345
PD0003,23619
PD0004,1456
PD0005,93451 0005,93451
PD0006,23112
PD0007,59838
PD0008,9445
PD0009,23119
PD0010,68990 0010 68990
这是一个简单的CSV,可惜我不能上传文件本身。客户数据本身更复杂,但我已经在缩短它了。
发布于 2022-10-02 11:42:33
我认为在这种情况下,您应该使用IntervalIndex
来裁剪,得到一个分类,然后您可以映射到标签。不幸的是,您必须手工输入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
发布于 2022-10-02 10:08:19
将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
https://stackoverflow.com/questions/73924733
复制相似问题