发布时间:2022-12-21 文章分类:编程知识 投稿人:王小丽 字号: 默认 | | 超大 打印

pandas的级联和合并

级联操作

pandas使用pd.concat函数,与np.concatenate函数类似,只是多了一些参数:

objs
axis=0
keys
join='outer' / 'inner':表示的是级联的方式,outer会将所有的项进行级联(忽略匹配和不匹配),而inner只会将匹配的项级联到一起,不匹配的不级联
ignore_index=False

合并操作

df1 = DataFrame({'employee':['regina','ivanlee','baby'],
                'group':['Accounting','Engineering','Engineering'],
                })
df2 = DataFrame({'employee':['regina','ivanlee','baby'],
                'hire_date':[2004,2008,2012],
                })
pd.merge(df1,df2,on='employee')

pandas替换,加载,透视表

一对多合并

df3 = DataFrame({
    'employee':['regina','ivanlee'],
    'group':['Accounting','Engineering'],
    'hire_date':[2004,2016]})
df4 = DataFrame({'group':['Accounting','Engineering','Engineering'],
                       'supervisor':['Carly','Guido','Steve']
                })
pd.merge(df3,df4)#on如果不写,默认情况下使用两表中公有的列作为合并条件

pandas替换,加载,透视表

多对多合并

df5 = DataFrame({'group':['Accounting','Engineering','HR'],
                'supervisor':['Carly','Guido','Steve']
                })

how 参数默认是inner,也可以是outer,right,left

pandas替换,加载,透视表

key的规范化

内合并与外合并:out取并集 inner取交集

人口分析项目

  • 需求:
    • 导入文件,查看原始数据
    • 将人口数据和各州简称数据进行合并
    • 将合并的数据中重复的abbreviation列进行删除
    • 查看存在缺失数据的列
    • 找到有哪些state/region使得state的值为NaN,进行去重操作
    • 为找到的这些state/region的state项补上正确的值,从而去除掉state这一列的所有NaN
    • 合并各州面积数据areas
    • 我们会发现area(sq.mi)这一列有缺失数据,找出是哪些行
    • 去除含有缺失数据的行
    • 找出2010年的全民人口数据
    • 计算各州的人口密度
    • 排序,并找出人口密度最高的州
#导入文件,查看原始数据
abb = pd.read_csv('../data/state-abbrevs.csv') #state(州的全称)abbreviation(州的简称)
area = pd.read_csv('../data/state-areas.csv') #state州的全称,area (sq. mi)州的面积
pop = pd.read_csv('../data/state-population.csv')#state/region简称,ages年龄,year时间,population人口数量

pandas替换,加载,透视表

#将人口数据和各州简称数据进行合并
abb_pop = pd.merge(abb,pop,left_on='abbreviation',right_on='state/region',how='outer') 必须保证数据完整
abb_pop.head()

pandas替换,加载,透视表

#将合并的数据中重复的abbreviation列进行删除
abb_pop.drop(labels='abbreviation',axis=1,inplace=True)
#查看存在缺失数据的列
#方式1:isnull,notll,any,all
abb_pop.isnull().any(axis=0)
#state,population这两列中是存在空值

pandas替换,加载,透视表

#1.将state中的空值定位到
abb_pop['state'].isnull()
#2.将上述的布尔值作为源数据的行索引
abb_pop.loc[abb_pop['state'].isnull()]#将state中空对应的行数据取出
#3.将简称取出
abb_pop.loc[abb_pop['state'].isnull()]['state/region']
#4.对简称去重
abb_pop.loc[abb_pop['state'].isnull()]['state/region'].unique()
#结论:只有PR和USA对应的全称数据为空值

pandas替换,加载,透视表

#为找到的这些state/region的state项补上正确的值,从而去除掉state这一列的所有NaN
#思考:填充该需求中的空值可不可以使用fillna?
    # - 不可以。fillna可以使用空的紧邻值做填充。fillna(value='xxx')使用指定的值填充空值
    # 使用给元素赋值的方式进行填充!
#1.先给USA的全称对应的空值进行批量赋值
abb_pop.loc[abb_pop['state/region'] == 'USA']#将usa对应的行数据取出
#1.2将USA对应的全称空对应的行索引取出
indexs = abb_pop.loc[abb_pop['state/region'] == 'USA'].index
abb_pop.iloc[indexs]
abb_pop.loc[indexs,'state'] = 'United States'
#2.可以将PR的全称进行赋值
abb_pop['state/region'] == 'PR'
abb_pop.loc[abb_pop['state/region'] == 'PR'] #PR对应的行数据
indexs = abb_pop.loc[abb_pop['state/region'] == 'PR'].index
abb_pop.loc[indexs,'state'] = 'PPPRRR'
#合并各州面积数据areas
abb_pop_area = pd.merge(abb_pop,area,how='outer')
#我们会发现area(sq.mi)这一列有缺失数据,找出是哪些行
abb_pop_area['area (sq. mi)'].isnull()
abb_pop_area.loc[abb_pop_area['area (sq. mi)'].isnull()] #空对应的行数据
indexs = abb_pop_area.loc[abb_pop_area['area (sq. mi)'].isnull()].index
#找出2010年的全民人口数据(基于df做条件查询)
abb_pop_area.query('ages == "total" & year == 2010')
#计算各州的人口密度(人口除以面积)
abb_pop_area['midu'] = abb_pop_area['population'] / abb_pop_area['area (sq. mi)']
abb_pop_area
#排序,并找出人口密度最高的州
abb_pop_area.sort_values(by='midu',axis=0,ascending=False).iloc[0]['state']

替换操作

pandas替换,加载,透视表

pandas替换,加载,透视表

我们要替换某列当中的数值

df.replace(to_replace={0,36},value='jiarui')
#将指定列的元素进行替换to_replase={列索引:被替换的值}

pandas替换,加载,透视表

映射操作

dic = {
    'name':['regina','ivanlee','regina'],
    'salary':[15000,20000,15000]
}
df = DataFrame(data=dic)

pandas替换,加载,透视表

先指定给regina映射为zhangjiarui,首先建立一张映射关系表

#映射关系表
dic = {
    'regina':'zhangjiarui',
    'ivanlee':'liyifan'
}
df['e_name'] = df['name'].map(dic)

pandas替换,加载,透视表

map是Series的方法,只能被Series调用

运算工具

排序实现的随机抽样

df = DataFrame(data=np.random.randint(0,100,size=(100,3)),columns=['A','B','C'])
#生成乱序的随机序列
np.random.permutation(10)
#将原始数据打乱
df.take([2,0,1],axis=1)
df.take(np.random.permutation(3),axis=1)

数据的分类处理

df = DataFrame({'item':['Apple','Banana','Orange','Banana','Orange','Apple'],
                'price':[4,3,3,2.5,4,2],
               'color':['red','yellow','yellow','green','green','green'],
               'weight':[12,20,50,30,20,44]})

pandas替换,加载,透视表

#想要水果的种类进行分析
df.groupby(by='item')
<pandas.core.groupby.generic.DataFrameGroupBy object at 0x7fac66bd1b20>
#查看详细的分组情况
df.groupby(by='item').groups

pandas替换,加载,透视表

高级数据聚合

def my_mean(s):
    m_sum = 0
    for i in s:
        m_sum += i
    return m_sum / len(s)

可以通过自定义的方式设计一个聚合操作

df.groupby(by='item')['price'].transform(my_mean) #经过映射
df.groupby(by='item')['price'].apply(my_mean) #不经过映射

pandas替换,加载,透视表

数据加载

透视表

pandas替换,加载,透视表

pivot_table有四个最重要的参数index、values、columns、aggfunc

交叉表

pandas替换,加载,透视表

#求出不同性别的抽烟人数
pd.crosstab(df.smoke,df.sex)

pandas替换,加载,透视表