pandas三、函数操作、maps处理数据

本文介绍如何使用Python的Pandas库处理葡萄酒评论数据,包括求均值、去重、统计频率、标准化价格、寻找性价比最高的酒款、关键词频率统计及自定义函数应用。

本节讲述 如何调整数据成我们想要的样子

1、求某一列数据的均值

import pandas as pd
pd.set_option("display.max_rows", 5)
reviews = pd.read_csv("winemag-data-130k-v2.csv", index_col=0)
median_points = reviews.points.median()

#  88.0
'''
另外可以使用 numpy.mean(reviews.points)
结果: 88.44713820775404
'''

2、求数据中有多少国家 即有多少不同的值  去重操作

countries = reviews.country.unique()
countries
'''
array(['Italy', 'Portugal', 'US', 'Spain', 'France', 'Germany',
       'Argentina', 'Chile', 'Australia', 'Austria', 'South Africa',
       'New Zealand', 'Israel', 'Hungary', 'Greece', 'Romania', 'Mexico',
       'Canada', nan, 'Turkey', 'Czech Republic', 'Slovenia', 'Luxembourg',
       'Croatia', 'Georgia', 'Uruguay', 'England', 'Lebanon', 'Serbia',
       'Brazil', 'Moldova', 'Morocco', 'Peru', 'India', 'Bulgaria',
       'Cyprus', 'Armenia', 'Switzerland', 'Bosnia and Herzegovina',
       'Ukraine', 'Slovakia', 'Macedonia', 'China', 'Egypt'], dtype=object)
'''

3、怎样统计一个国家在数据中 出现频率呢?

每个国家/地区出现在数据集中的频率如何?创建一个系列`reviews_per_country`,将国家/地区映射到该国的葡萄酒评论数量。

reviews_per_country = reviews.country.value_counts()
reviews_per_country 
'''
US          54504
France      22093
            ...  
Slovakia        1
China           1
Name: country, Length: 43, dtype: int64
'''

4、求物品的值减去自己的平均值,这在机器学习中经常用到。

reviews.price - reviews.price.median()
'''
0          NaN
1        -10.0
          ... 
129969     7.0
129970    -4.0
Name: price, Length: 129971, dtype: float64
'''

5、哪种酒是“最便宜的”?使用数据集中具有最高点价比的葡萄酒标题,创建变量`bargain_wine`。

点价比 = pionts / prices

 

(reviews.points / reviews.price)
'''
0              NaN
1         5.800000
            ...   
129969    2.812500
129970    4.285714
Length: 129971, dtype: float64
'''

这里我们要最大值,要用到idxmax()这个函数。下面是这个函数的简单介绍。

Series.idxmax(axis=0skipna=True*args**kwargs)[source]

Return the row label of the maximum value.

If multiple values equal the maximum, the first row label with that value is returned.

Parameters:

skipna : boolean, default True

Exclude NA/null values. If the entire Series is NA, the result will be NA.

axis : int, default 0

For compatibility with DataFrame.idxmax. Redundant for application on Series.

*args, **kwargs

Additional keywors have no effect but might be accepted for compatibility with NumPy.

Returns:

idxmax : Index of maximum of values.

Raises:

ValueError

If the Series is empty.

正如上面看到的 idxmax()的作用·就是但会标签列中最大的一列。

(reviews.points / reviews.price).idxmax()

# 64590

这还没算完,我们要找出到底是哪种酒,那么滴物超所值?

bargin_wine_index= (reviews.points / reviews.price).idxmax()
bargin_wine = reviews.loc[bargin_wine_index, 'title']
# 这里为什么不用 iloc[bargin_wine_index, 'title'] 这样用是错的
# reviews.iloc[bargin_wine_index, 10]  即还要数 title是位于第几列  loc以列进行搜查
bargin_wine
'''
'Bandit NV Merlot (California)'
'''

6、在描述一瓶葡萄酒时,您可以使用的字数太多了。葡萄酒更可能是“tropical”还是“fruity”?创建一个系列`descriptor_counts`,计算这两个单词中每个单词在数据集的`description`列中出现的次数。

这里要用到map,map()函数可以用于Series对象或DataFrame对象的一列,接收函数作为或字典对象作为参数,返回经过函数或字典映射处理后的值。

reviews.description.map(lambda desc: "tropical" in desc)
'''
这里使用map 和 lambda进行配合 
lambda编写匿名函数 用于 description列中 对每一列进行判断是否 包含有 tropical
上面处理结果:
0          True
1         False
          ...  
129969    False
129970    False
Name: description, Length: 129971, dtype: bool 
'''

当然我们要留下我们要求的,即有多少符合 我们用sum函数进行统计为true的。

reviews.description.map(lambda desc: "tropical" in desc).sum()
# 3607

类似的处理fruity也一样。

n_trop = reviews.description.map(lambda desc: "tropical" in desc).sum()
n_fruity = reviews.description.map(lambda desc: "fruity" in desc).sum()
descriptor_counts = pd.Series([n_trop, n_fruity], index=['tropical', 'fruity'])
descriptor_counts 

'''
Out[69]:
tropical    3607
fruity      9090
dtype: int64
'''

7、写个函数应用在列方向上 处理一些需求

我们想在我们的网站上举办这些葡萄酒评论,但是评分系统从80到100分不太难理解 - 我们希望将它们翻译成简单的星级评分。得分为95或更高计为3星,得分至少为85但低于95为2星。任何其他分数是1星。 此外,加拿大葡萄酒商协会在该网站上购买了大量广告,因此任何来自加拿大的葡萄酒都应自动获得3星,无论积分如何。 创建一个系列`star_ratings`,其中包含与数据集中每个评论相对应的星号数。

时需要我们写一个函数 处理上面稍多些的操作。

def stars(row):
    if row.country == 'Canada':
        return 3
    elif row.points >= 95:
        return 3
    elif row.points >= 85:
        return 2
    else:
        return 1

star_ratings = reviews.apply(stars, axis='columns')
# 上面表示 apply 第一个参数 为函数名 不加() , axis 表示应用再列方向上。
star_ratings 
'''
0         2
1         2
         ..
129969    2
129970    2
Length: 129971, dtype: int64
'''

 

<think>好的,用户之前已经询问过Python在GIS开发中的应用,现在他们具体想了解如何使用arcpy进行空间数据分析和处理。首先,我需要确定用户的需求层次。他们可能是GIS专业人员,或者正在学习ArcGIS,希望利用Python来自动化任务,提高效率。用户可能已经了解了一些Python库如GeoPandas,但想深入掌握Esri的arcpy,因为ArcGIS在行业中应用广泛,尤其是在企业和政府项目中。 接下来,我要考虑用户可能的实际应用场景。例如,他们可能需要批量处理数据、执行空间分析,或者创建自定义工具。需要确保回答覆盖arcpy的基础和高级功能,包括数据处理、空间分析、地图自动化等。同时,用户可能对如何集成arcpy到现有工作流感兴趣,比如与ArcGIS Pro或ArcMap的结合使用。 还要注意用户可能遇到的问题,比如arcpy的学习曲线、性能优化,或者如何处理常见的错误。因此,在回答中应该提供实用示例、最佳实践和学习资源。此外,用户可能希望了解arcpy与其他Python库(如Pandas或NumPy)的协作,以扩展功能。 需要确保回答结构清晰,分点说明arcpy的功能、应用场景、示例代码以及学习路径。考虑到用户可能需要快速上手,提供简单的代码片段会很有帮助。同时,强调arcpy的优势,如与Esri生态系统的无缝集成,以及它在自动化复杂工作流中的作用。 另外,用户可能对arcpy在最新版本中的更新感兴趣,比如ArcGIS Pro中的新功能或改进。虽然当前知识截止到2023年10月,但应尽量涵盖已知的重要更新。最后,确保回答的语言简洁明了,避免过于专业的术语,或在必要时进行解释,以便不同层次的用户都能理解。</think>--- ### **使用 ArcPy 进行空间数据分析和处理** **ArcPy** 是 Esri 为 ArcGIS 平台提供的 Python 库,专为地理数据处理、空间分析和自动化制图设计。它与 ArcGIS Desktop(如 ArcMap)和 ArcGIS Pro 无缝集成,支持通过脚本批量处理复杂任务,提升 GIS 工作流的效率。以下是其核心功能和应用方法: --- ### **一、ArcPy 的核心模块与功能** | **模块/功能** | **用途** | |----------------------|-------------------------------------------------------------------------| | **`arcpy.da`** | 高性能数据访问(游标操作),适用于大数据处理。 | | **`arcpy.mapping`** | 自动化地图文档(.mxd)管理,批量导出PDF/图片、修改图层样式。 | | **`arcpy.sa`** | 空间分析工具(如坡度计算、重分类、水文分析),支持栅格数据处理。 | | **`arcpy.na`** | 网络分析(最短路径、服务区划分),需配合 Network Dataset 使用。 | | **`arcpy.mp`** | 针对 ArcGIS Pro 的项目(.aprx)管理,自动化布局和地图调整。 | --- ### **二、常见应用场景与代码示例** #### **1. 数据批量处理** **场景**:将文件夹内所有 Shapefile 转换为地理数据库要素类。 ```python import arcpy # 设置工作环境 arcpy.env.workspace = "C:/data/shapefiles" output_gdb = "C:/data/output.gdb" # 遍历所有 Shapefile 并转换 for shp in arcpy.ListFiles("*.shp"): output_name = shp[:-4] # 去除后缀 arcpy.FeatureClassToGeodatabase_conversion(shp, output_gdb) print(f"已转换: {output_name}") ``` #### **2. 空间分析(缓冲区叠加)** **场景**:计算河流 500 米缓冲区内的土地利用类型面积。 ```python import arcpy # 输入数据 river = "C:/data/rivers.shp" landuse = "C:/data/landuse.shp" # 创建缓冲区 buffer_temp = "C:/temp/river_buffer.shp" arcpy.Buffer_analysis(river, buffer_temp, "500 Meters") # 叠加分析(相交) output_intersect = "C:/output/landuse_river_intersect.shp" arcpy.Intersect_analysis([buffer_temp, landuse], output_intersect) # 统计面积 with arcpy.da.SearchCursor(output_intersect, ["LAND_TYPE", "SHAPE@AREA"]) as cursor: for row in cursor: print(f"类型: {row[0]}, 面积: {row[1]:.2f} 平方米") ``` #### **3. 自动化制图** **场景**:批量导出地图文档中的所有布局为 PDF。 ```python import arcpy mxd_path = "C:/maps/project.mxd" output_folder = "C:/maps/export" mxd = arcpy.mapping.MapDocument(mxd_path) for page_num in range(1, mxd.dataDrivenPages.pageCount + 1): mxd.dataDrivenPages.currentPageID = page_num page_name = mxd.dataDrivenPages.pageRow.FieldName # 假设按字段名命名 arcpy.mapping.ExportToPDF(mxd, f"{output_folder}/{page_name}.pdf") del mxd # 释放内存 ``` --- ### **、关键技术与最佳实践** #### **1. 游标(Cursor)操作** - **用途**:高效读写属性表和几何对象。 - **示例**:更新字段值 ```python with arcpy.da.UpdateCursor("cities.shp", ["POPULATION", "RANK"]) as cursor: for row in cursor: if row[0] > 1000000: row[1] = "特大城市" else: row[1] = "一般城市" cursor.updateRow(row) ``` #### **2. 地理处理工具调用** - **直接调用工具**:使用 `arcpy.<工具名>_<工具箱别名>`,如 `arcpy.Buffer_analysis()`。 - **参数传递**:需按工具文档顺序传入参数,可通过 `arcpy.GetParameterAsText()` 适配脚本工具对话框。 #### **3. 性能优化** - **临时文件管理**:使用 `arcpy.env.scratchGDB` 避免硬盘碎片。 - **并行处理**:对独立任务使用 `arcpy.mp.ArcGISProject().listMaps()` 多线程处理。 --- ### **四、常见问题与解决方案** 1. **许可错误**:确保已安装对应扩展模块(如 Spatial Analyst)并检查 `arcpy.CheckExtension("3D")`。 2. **路径问题**:使用原始字符串(如 `r"C:\data"`)或双反斜杠(`"C:\\data"`)避免转义错误。 3. **内存泄漏**:及时释放对象(`del mxd`),避免在循环中重复创建游标。 --- ### **五、学习资源推荐** 1. **官方文档**: - [ArcPy 函数列表](https://pro.arcgis.com/en/pro-app/arcpy/get-started/what-is-arcpy-.htm) 2. **书籍**: - 《Python for ArcGIS Pro》 (包瑞清译) - 《Automating ArcGIS with Python》 3. **实战项目**: - 批量处理卫星影像(镶嵌、裁剪) - 构建自定义路径规划工具(结合 Network Analyst) --- **总结**:ArcPy 是 GIS 工程师和数据分析师的利器,尤其适合需要与 ArcGIS 生态深度集成的场景。通过脚本化替代手动操作,可大幅提升复杂空间任务的执行效率。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值