DW数据重构
数据合并
拼接pd.concat([],axis,join,ignore_index)
pd.concat([df1,df2,df3],axis=0/1,join=‘outer’,ignore_index=True,join_axes=[df1.index])
df1 = pd.DataFrame(np.ones((3,4))*0, columns=['a','b','c','d'])
df2 = pd.DataFrame(np.ones((3,4))*1, columns=['a','b','c','d'])
df3 = pd.DataFrame(np.ones((3,4))*2, columns=['a','b','c','d'])
#res = pd.concat([df1,df2,df3],axis=0) #axis=0纵向合并
# 上述合并过程中,index重复,下面给出重置index方法
# 只需要将index_ignore设定为True即可
res = pd.concat([df1,df2,df3],axis=0,ignore_index=True)
df1 = pd.DataFrame(np.ones((3,4))*0, columns=['a','b','c','d'], index=[1,2,3])
df2 = pd.DataFrame(np.ones((3,4))*1, columns=['b','c','d','e'], index=[2,3,4])
'''
a b c d
1 0.0 0.0 0.0 0.0
2 0.0 0.0 0.0 0.0
3 0.0 0.0 0.0 0.0
b c d e
2 1.0 1.0 1.0 1.0
3 1.0 1.0 1.0 1.0
4 1.0 1.0 1.0 1.0
'''
'''
join='outer',函数默认为join='outer'。此方法是依照column来做纵向合并,有相同的column上下合并在一起,
其他独自的column各自成列,原来没有值的位置皆为NaN填充。
'''
# 纵向"外"合并df1与df2
res = pd.concat([df1,df2],axis=0,join='outer',ignore_index=True)
#默认outer形式,没有的填充NaN; inner是寻找共同的部分合并
'''outer结果
a b c d e
0 0.0 0.0 0.0 0.0 NaN
1 0.0 0.0 0.0 0.0 NaN
2 0.0 0.0 0.0 0.0 NaN
3 NaN 1.0 1.0 1.0 1.0
4 NaN 1.0 1.0 1.0 1.0
5 NaN 1.0 1.0 1.0 1.0
inner结果
b c d
1 0.0 0.0 0.0
2 0.0 0.0 0.0
3 0.0 0.0 0.0
2 1.0 1.0 1.0
3 1.0 1.0 1.0
4 1.0 1.0 1.0
'''
# concat还有参数join_axes(依照axes合并)
# 依照df1.index进行横向合并: join_axes=[df1.index]
纵向合并df1.append(df2,ignore_index=True)
# append(添加数据)
# append只有纵向合并,没有横向合并
df1 = pd.DataFrame(np.ones((3,4))*0, columns=['a','b','c','d'])
df2 = pd.DataFrame(np.ones((3,4))*1, columns=['a','b','c','d'])
df3 = pd.DataFrame(np.ones((3,4))*2, columns=['a','b','c','d'])
s1 = pd.Series([1,2,3,4], index=['a','b','c','d'])
# 将df2合并到df1下面,以及重置index
res = df1.append(df2,ignore_index=True)
横向合并df1.join(df2)
resul_up = text_left_up.join(text_right_up)
result_down = text_left_down.join(text_right_down)#df 的join:横向合并
result = result_up.append(result_down) #append只有纵向合并
join方法是基于index连接dataframe,merge方法是基于column连接
pd.merge()
pandas的merge方法是基于共同列,将两个dataframe连接起来。merge方法的主要参数:
left/right:左/右位置的dataframe。
how:数据合并的方式。left:基于左dataframe列的数据合并;right:基于右dataframe列的数据合并;outer:基于列的数据外合并(取并集);inner:基于列的数据内合并(取交集);默认为’inner’。
on:用来合并的列名,这个参数需要保证两个dataframe有相同的列名。
left_on/right_on:左/右dataframe合并的列名,也可为索引,数组和列表。
left_index/right_index:是否以index作为数据合并的列名,True表示是。
sort:根据dataframe合并的keys排序,默认是。
suffixes:若有相同列且该列没有作为合并的列,可通过suffixes设置该列的后缀名,一般为元组和列表类型。
参考例子链接:https://www.cnblogs.com/keye/p/10791705.html
left = pd.DataFrame({'key' : ['K0','K1','K2','K3'],
'A' : ['A0','A1','A2','A3'],
'B' : ['B0','B1','B2','B3']})
right = pd.DataFrame({'key': ['K0', 'K1', 'K2', 'K3'],
'C' : ['C0', 'C1', 'C2', 'C3'],
'D' : ['D0', 'D1', 'D2', 'D3']})
'''
key A B
0 K0 A0 B0
1 K1 A1 B1
2 K2 A2 B2
3 K3 A3 B3
key C D
0 K0 C0 D0
1 K1 C1 D1
2 K2 C2 D2
3 K3 C3 D3
'''
# 依据key column合并,并打印
res = pd.merge(left,right,on='key') #on表示在哪一个columns 上进行合并
'''
key A B C D
0 K0 A0 B0 C0 D0
1 K1 A1 B1 C1 D1
2 K2 A2 B2 C2 D2
3 K3 A3 B3 C3 D3
'''
left = pd.DataFrame({'key1': ['K0', 'K0', 'K1', 'K2'],
'key2': ['K0', 'K1', 'K0', 'K1'],
'A': ['A0', 'A1', 'A2', 'A3'],
'B': ['B0', 'B1', 'B2', 'B3']})
right = pd.DataFrame({'key1': ['K0', 'K1', 'K1', 'K2'],
'key2': ['K0', 'K0', 'K0', 'K0'],
'C': ['C0', 'C1', 'C2', 'C3'],
'D': ['D0', 'D1', 'D2', 'D3']})
'''
key1 key2 A B
0 K0 K0 A0 B0
1 K0 K1 A1 B1
2 K1 K0 A2 B2
3 K2 K1 A3 B3
key1 key2 C D
0 K0 K0 C0 D0
1 K1 K0 C1 D1
2 K1 K0 C2 D2
3 K2 K0 C3 D3
'''
# 依据key1与key2 columns进行合并,四种结果['left', 'right', 'outer', 'inner']
res = pd.merge(left, right, on=['key1', 'key2'], how='inner')
"""merge 默认是inner,就是重复部分合并!!!!!!!!!!!!!!合并有点意思
how = ['left','right','outer','inner']
outer是所有的合并,没数字的添NaN
right和left分别是基于两个DataFrame的合并"""
Indicator设置合并列名称
# Indicator指示器 显示合并方式,哪个有数据
df1 = pd.DataFrame({'col1':[0,1],'col_left':['a','b']})
df2 = pd.DataFrame({'col1':[1,2,2],'col_right':[2,2,2]})
# 自定义indicator column的名称,并打印出
res = pd.merge(df1,df2,on='col1',how='outer',indicator='indicator_column')
依据index合并
# 依据左右资料集的index进行合并,how='outer',并打印
res = pd.merge(left,right,left_index=True,right_index=True,how='outer')
# 错的,只能连接index为数字的,str型不可res1=pd.concat(['left','right'],axis=1,)
将数据变为Series类型的数据
在用pandas进行数据重排时,经常用到stack和unstack两个函数。stack的意思是堆叠,堆积,unstack即“不要堆叠”stack将columns变为index
,unstack相反,将index变为columns,这个对于多层索引应用效果比较好,其实是为了聚合统计方便的
- stack()是将原来的列索引转成了最内层的行索引,这里是多层次索引,其中AB索引对应第三层,即最内层索引。
- unstack()是stack()的逆操作,这里把最内层的行索引还原成了列索引。但是unstack()中有一个参数可以指定旋转第几层索引,比如unstack(0)就是把第一层行索引转成列索引,但默认的是把最内层索引转层列索引
unit_result=text.stack().head(20)
unit_result.head()
'''
0 Unnamed: 0 0
PassengerId 1
Survived 0
Pclass 3
Name Braund, Mr. Owen Harris
dtype: object
'''
GroupBy机制
groupby 是pandas 中非常重要的一个函数, 主要用于数据聚合和分类计算. 其思想是“split-apply-combine”(拆分 - 应用 - 合并).
df[‘数据的结果属性名称比如票价’].groupby([df[依据什么分类],df[比如说性别]).mean()(对于数据的计算方式——函数名称)
#计算泰坦尼克号男性与女性的平均票价
df = text['Fare'].groupby(text['Sex'])
means = df.mean()
或者
text.groupby(['Sex'])['Fare'].mean()
#男女的存活人数
text.groupby(['Sex'])['Survived'].sum()
#统计在不同等级的票中的不同年龄的船票花费的平均值
text.groupby(['Pclass','Age'])['Fare'].mean().head()