首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何将数据帧的邮政编码排序到python的货运区域?

如何将数据帧的邮政编码排序到python的货运区域?
EN

Stack Overflow用户
提问于 2022-10-02 09:26:37
回答 2查看 94关注 0票数 2

基本上,我有一个熊猫的数据(从一个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,可惜我不能上传文件本身。客户数据本身更复杂,但我已经在缩短它了。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2022-10-02 11:42:33

我认为在这种情况下,您应该使用IntervalIndex来裁剪,得到一个分类,然后您可以映射到标签。不幸的是,您必须手工输入126个bin定义(除非您可以以某种方式解析PDF ),但假设您将拥有的内容转换成如下形式:

代码语言:javascript
运行
复制
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']

那么,假设您的数据如下所示:

代码语言:javascript
运行
复制
df = pd.DataFrame({'zip_code': ['14989', '35345', '23619', '01456', '93451', '23112', '59838', '09445', '23119', '68990']})

你可以像这样为所有的人弄到这样的区域:

代码语言:javascript
运行
复制
df['area'] = pd.cut(df['zip_code'].astype(int), bins).map(dict(zip(bins, labels)))

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

输出:

代码语言:javascript
运行
复制
    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
票数 1
EN

Stack Overflow用户

发布于 2022-10-02 10:08:19

pd.cutfillna结合使用

代码语言:javascript
运行
复制
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')

输出

代码语言:javascript
运行
复制
       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

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/73924733

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档