3-python数据分析-DataFrame级联与合并操作巩固之人口分析案例
需求
- 导入文件,查看原始数据
- 将人口数据和各州简称数据进行合并
- 将合并的数据中重复的abbreviation列进行删除
- 查看存在缺失数据的列
- 找到有哪些state/region使得state的值为NaN,进行去重操作
- 为找到的这些state/region的state项补上正确的值,从而去除掉state这一列的所有NaN
- 合并各州面积数据areas
- 我们会发现area(sq.mi)这一列有缺失数据,找出是哪些行
- 去除含有缺失数据的行
- 找出2010年的全民人口数据
- 计算各州的人口密度
- 排序,并找出人口密度最高的州
1. 导入文件,查看原始数据
import pandas as pd from pandas import Series, DataFrame import numpy as np add = pd.read_csv('./data/state-abbrevs.csv') add.head() # 数据中state为州的全称,abbreviation为州的简称
pop = pd.read_csv('./data/state-population.csv') pop.head()
area = pd.read_csv('./data/state-areas.csv') area.head()
2. 将人口数据和各州简称数据进行合并
pop_add = pd.merge(add, pop, left_on='abbreviation', right_on='state/region', how='outer') pop_add.head()
3. 将合并的数据中重复的abbreviation列进行删除
pop_add.drop(labels='abbreviation', axis=1, inplace=True)
4. 查看存在缺失数据的列
pop_add.isnull().any(axis=0) state True state/region False ages False year False population True dtype: bool pop_add.info() <class 'pandas.core.frame.DataFrame'> Int64Index: 2544 entries, 0 to 2543 Data columns (total 5 columns): state 2448 non-null object state/region 2544 non-null object ages 2544 non-null object year 2544 non-null int64 population 2524 non-null float64 dtypes: float64(1), int64(1), object(3) memory usage: 119.2+ KB
补充俩个常用方法
- unique 查看存有哪些不同的元素 只能被Series调用
- value_counts 查看不同元素出现的次数 只能被Series调用
查看ages列中存有哪些不同的元素
pop_add['ages'].unique() array(['under18', 'total'], dtype=object)
查看ages列中不同元素出现的次数
pop_add['ages'].value_counts() total 1272 under18 1272 Name: ages, dtype: int64
5. 找到有哪些state/region(州简称)使得state(州全称)的值为NaN,进行去重操作
前提:由上题得知state列中存有空值数据
将state列中的空值对应的简称数据找出,且对这些找出的简称数据进行去重,去重后就可以得知到底是哪些简称对应的全称的值为空
# 1.将state中的空值找出 pop_add['state'].isnull() # 2.将步骤1获取的布尔值作为源数据的行索引,获得state为空值对应的行数据 pop_add.loc[pop_add['state'].isnull()] # 3.将步骤二获取的df中的简称列取出即可 pop_add.loc[pop_add['state'].isnull()]['state/region'] #4.去重 pop_add.loc[pop_add['state'].isnull()]['state/region'].unique() array(['PR', 'USA'], dtype=object) # 找到了PR,USA简称对应的全称为空
6. 为找到的这些state/region的state项补上正确的值,从而去除掉state这一列的所有NaN
# 1.将PR对应的行数据取出 pop_add['state/region'] == 'PR' pop_add.loc[pop_add['state/region'] == 'PR'] # 2.可以将上一步获取的临时表的行索引获取 # 行索引就是PR对应的空值对应的行索引 indexs = pop_add.loc[pop_add['state/region'] == 'PR'].index # 3.填充 pop_add.loc[indexs,'state'] = 'PPPRRR'
#1.将USA对应的行数据取出 pop_add['state/region'] == 'USA' pop_add.loc[apop_add['state/region'] == 'USA'] #2.获取需要填充空值的索引 indexs = pop_add.loc[pop_add['state/region'] == 'USA'].index #3.填充 pop_add.loc[indexs, 'state'] = 'United States America'
7. 合并各州面积数据areas
pop_add_area = pd.merge(pop_add, area, on='state', how='outer') pop_add_area.head()
8. 我们会发现area(sq.mi)这一列有缺失数据,找出是哪些行
indexs = pop_add_area.loc[pop_add_area['area (sq. mi)'].isnull()].index Int64Index([2448, 2449, 2450, 2451, 2452, 2453, 2454, 2455, 2456, 2457, 2458, 2459, 2460, 2461, 2462, 2463, 2464, 2465, 2466, 2467, 2468, 2469, 2470, 2471, 2472, 2473, 2474, 2475, 2476, 2477, 2478, 2479, 2480, 2481, 2482, 2483, 2484, 2485, 2486, 2487, 2488, 2489, 2490, 2491, 2492, 2493, 2494, 2495, 2496, 2497, 2498, 2499, 2500, 2501, 2502, 2503, 2504, 2505, 2506, 2507, 2508, 2509, 2510, 2511, 2512, 2513, 2514, 2515, 2516, 2517, 2518, 2519, 2520, 2521, 2522, 2523, 2524, 2525, 2526, 2527, 2528, 2529, 2530, 2531, 2532, 2533, 2534, 2535, 2536, 2537, 2538, 2539, 2540, 2541, 2542, 2543], dtype='int64')
9. 去除含有缺失数据的行
indexs = pop_add_area.loc[pop_add_area['area (sq. mi)'].isnull()].index pop_add_area.drop(labels=indexs,axis=0, inplace=True)
10. 找出2010年的全民人口数据 query 条件查询
pop_add_area.query('year==2010 and ages=="total"') pop_add_area.query('year == 2010 & ages == "total"')
11. 计算各州的人口密度
# 人口密度:人口/面积 pop_add_area['midu'] = pop_add_area['population'] / pop_add_area['area (sq. mi)'] # 这样做是不对的,缺少考虑,这里主要的目的是告诉你如何添加1列,下面是正确方法,但需要通过映射将数据添加到原数据
pop_add_area.query('ages == "total"')['population'] / pop_add_area.query('ages == "total"')['area (sq. mi)']
12. 排序,并找出人口密度最高的州 sort_values
by根据哪列,ascending默认是True表示升序,False为降序
# by根据哪列,ascending默认是True表示升序,False为降序 pop_add_area.sort_values(by='midu', axis=0, ascending=False)