数据分析实例——美国加州人口分析[isnull().any()/.unique()/merge/set_index/df.query/sort_values]

本文通过合并多个数据集,分析了美国各州的人口数量及人口密度,详细介绍了如何处理缺失数据并计算人口密度,最终筛选出了人口密度最高和最低的五个州。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、准备好数据集

二、需求分析

案例分析:美国各州人口数据分析

作业知识补充

首先导入文件,并查看数据样本

合并pop与abbrevs两个DataFrame,分别依据state/region列和abbreviation列来合并。

为了保留所有信息,使用外合并。

查看存在缺失数据的列。

使用.isnull().any(),只有某一列存在一个缺失数据,就会显示True。

查看缺失数据

根据数据是否缺失情况显示数据,如果缺失为True,那么显示

找到有哪些state/region使得state的值为NaN,使用unique()查看非重复值

为找到的这些state/region的state项补上正确的值,从而去除掉state这一列的所有NaN!

记住这样清除缺失数据NaN的方法!

合并各州面积数据areas,使用左合并。

思考一下为什么使用外合并?

继续寻找存在缺失数据的列

我们会发现area(sq.mi)这一列有缺失数据,为了找出是哪一行,我们需要找出是哪个state没有数据

去除含有缺失数据的行

查看数据是否缺失

找出2010年的全民人口数据,df.query(查询语句)

对查询结果进行处理,以state列作为新的行索引:set_index

计算人口密度。注意是Series/Series,其结果还是一个Series。

排序,并找出人口密度最高的五个州sort_values()

找出人口密度最低的五个州

要点总结:

  • 统一用loc()索引
  • 善于使用.isnull().any()找到存在NaN的列
  • 善于使用.unique()确定该列中哪些key是我们需要的
  • 一般使用外合并、左合并,目的只有一个:宁愿该列是NaN也不要丢弃其他列的信息

 

三、操作实例

1.导入三剑客:

import numpy as np
import pandas as pd
from pandas import Series,DataFrame

2.导入文件

abb=pd.read_csv('../data/state-abbrevs.csv')
areas=pd.read_csv('../data/state-areas.csv')
pop=pd.read_csv('../data/state-population.csv')

3.查看数据结构

4.实现需求

① 合并pop与abbrevs两个DataFrame,分别依据state/region列和abbreviation列来合并。

【为了保留所有信息,使用外合并】

abb_pop=pd.merge(abb,pop,left_on='abbreviation',right_on='state/region',how='outer')
abb_pop.head()

删除重复的列: .drop('abbreviation',axis=1,inplace=True)

#删除重复的列
abb_pop.drop('abbreviation',axis=1,inplace=True)
abb_pop.head()

查看存在缺失数据的列: 使用.isnull().any(),只有某一列存在一个缺失数据,就会显示True。

abb_pop.isnull().head()  #如果df中存在空值,则空值对应的行列位置显示的是True

abb_pop.isnull().any(axis=0) #检查每一列中是否存在空值(True)
#运行结果发现只有state和population中存在空值

④查看缺失数据【根据数据是否缺失情况显示数据,如果缺失为True,那么显示

#查看的是population列中空值所对应的行信息------------
misspop=abb_pop['population'].isnull() #找出pop这一列中所有的空值,如果是空值则返回True
misspop

abb_pop.loc[misspop] #获取了pop空值所对应的行数据


#查看的是state这一列中空值存在情况------------------
missState=abb_pop['state'].isnull()#如果该列中某一个数组元素为空值则显示True
missState 

#将上一步返回的布尔列表作为行索引
State=abb_pop.loc[missState]
State

 

⑤找到那些state的值为NAN,使用unique()查看非重复值

state['state/region'].unique()
#unique()是Serise的一个函数,该函数可以对Serise中的数组元素进行去重
Output: array(['PR', 'USA'], dtype=object)

为找到的这些state/region的state项补上正确的值,从而去除掉state这一列的所有NaN!

abb_pop['state/region']=='PR'  
#返回一组布尔值,True表示True所在位置的元素值为PR。
#获取的这组布尔值的意义在于想要将其作为行索引,
#目的是为了获取一个或者一组数组元素,将数组元素进行修改。

abb_pop.loc[abb_pop['state/region']=='PR','state']='PUERTO RICO'
abb_pop.loc[abb_pop['state/region']=='USA','state']='United State'

测试是否还存在空数据,使用isnull(),出现False表示没有空值

abb_pop['state'].isnull().any()
Output:False

⑥合并各州面积数据araes,使用左合并

abb_pop.head()
areas.head()

abb_pop_areas=pd.merge(abb_pop,areas,how='left')
abb_pop_areas

⑦继续寻找缺失的数据的列

abb_pop_areas.isnull().any()

  • 发现area(sq.mi)这一列有缺失值,为了找出是哪一行,需要找到那个state没有数据
abb_pop_areas['area (sq. mi)'].isnull()
abb_pop_areas.loc[abb_pop_areas['area (sq. mi)'].isnull()]

#获取行索引
indexs=abb_pop_area.loc[abb_pop_area['area (sq. mi)'].isnull()].index

去除含有缺失数据的行

abb_pop_areas.drop(indexs,axis=0,inplace=True)

⑧找出2010年的全民人口数据,df.query(查询语句)

abb_pop_areas.head()

data_2010=abb_pop_areas.query("year==2010 & ages=='total'")
data_2010.head()

⑨对查询结果进行处理,以state列作为新的行索引:set_index

data_2010['state']
data_2010_index=data_2010.set_index(data_2010['state'])
data_2010_index.head()

 

⑩计算人口密度【注意是Series/Series,其结果还是一个Series。】

data_2010_index['population']/data_2010_index['area (sq. mi)']
data_2010_index['midu']=data_2010_index['population']/data_2010_index['area (sq. mi)']
data_2010_index.head()

⑪排序,并找出人口密度最高的5个州 : sort_values

data_2010_index.sort_values(by='midu',axis=0,ascending=False).head()

找出人口密度最低的五个州

data_2010_index.sort_values(by='midu',axis=0,ascending=False).tail()

 

<think>嗯,用户这次的问题是希望解释一个具体的XDMA命令行工具的参数含义,结合之前的引用内容看,用户应该是在操作基于FPGA的PCIe数据传输。用户提供了五条引用信息,重点集中在引用[1][3][5],其中涉及dma_to_device工具的使用和寄存器操作。用户可能正在调试XDMA驱动程序的数据传输功能,从命令参数中的bin文件名(dram_merge_write.bin)看,可能与存储器写入测试有关。特别注意到用户提供的命令中数据量很大(168MB),这通常属于实际应用场景而非简单测试,用户或许在进行DRAM数据预加载或固件更新。需要重点解析的关键参数是:--d参数根据引用[1][3]明确指向硬件设备节点,h2c_0表示主机到卡片的通道--a的地址值0x0000000000000000非常特殊,这在引用[3][4]中都有提及,结合引用[5]描述的流式DMA映射机制,说明这是将数据写入目标设备内存的起始位置(比如DRAM基地址)--s参数168493568这个精确值(约168MB)值得注意,提示用户可能在处理特定尺寸的数据块,比如视频流或雷达采样数据用户没有询问但可能需要补充的知识点:这个巨大数据量传输可能涉及的DMA描述符链机制(引用[5]提到的高/低地址寄存器配合),以及root权限的必要性(引用[4]强调)。另外提醒中断机制和内存对齐会更好。考虑到这是硬件级操作,特别需要警告:直接写设备基地址存在风险。最后生成的三个延伸问题都针对实际应用痛点——状态验证、参数计算和异常处理,这比单纯询问理论更有实操价值。</think> 以下是对命令的完整解释(已整合XDMA驱动机制): ```bash sudo ../tools/dma_to_device -d /dev/xdma0_h2c_0 -f ./dsopu/dram_merge_write.bin -a 0x0000000000000000 -s 168493568 ``` ### 命令参数解析: 1. **`sudo`** - 提权操作(因操作FPGA设备需要root权限)[^4] 2. **`../tools/dma_to_device`** - XDMA驱动程序提供的工具,实现主机内存 → PCIe设备的数据传输 - 路径说明:从当前目录的上级目录进入`tools`文件夹执行 3. **`-d /dev/xdma0_h2c_0`** - `-d`:指定设备节点(device node) - `/dev/xdma0_h2c_0`:主机到卡(Host-to-Card)的DMA通道设备文件 - 命名规则: `xdma0_`(设备实例) + `h2c`(方向) + `_0`(通道号) 4. **`-f ./dsopu/dram_merge_write.bin`** - `-f`:指定源数据文件路径 - `./dsopu/dram_merge_write.bin`:主机上的二进制数据文件(约168MB) 5. **`-a 0x0000000000000000`** - `-a`:目标设备的物理地址(需对齐XDMA要求) - `0x0`:写入FPGA端内存/寄存器的**基地址**(通常为DRAM起始地址)[^5] 6. **`-s 168493568`** - `-s`:传输数据大小(单位:字节) - `168,493,568 bytes` = 168.49 MB(精确控制传输量,避免越界) ### 底层工作机制[^5]: 1. **DMA描述符生成** ```c struct xdma_desc { u32 src_addr_lo; // 主机内存低32位地址 u32 src_addr_hi; // 主机内存高32位地址 u32 dst_addr_lo; // 设备地址低32位(0x00000000) u32 dst_addr_hi; // 设备地址高32位(0x00000000) u32 bytes; // 传输字节数(168493568) }; ``` 2. **寄存器交互** 通过写入XDMA IP的`H2C Descriptor Address`寄存器,通知FPGA获取描述符 3. **数据搬运** FPGA DMA控制器根据描述符,直接从主机内存读取数据写入目标地址 ### 典型应用场景: 1. FPGA板载DRAM初始化 2. 加速卡固件加载 3. 大块数据预传输(如图像帧、神经网络权重) ---
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值