一、
1、长宽格式转换
基于多重索引,Pandas 可以很容易地完成长型、宽型数据格式的相互转换。
1.1 转换为最简格式
stack()其使用法如下:
stack函数用于将DataFrame中的列转换为行,即将宽格式数据转换为长格式数据。
df.stack(level = -1 :需要处理的索引级别,默认为全部,int/string/listdropna = True :是否删除为缺失值的行
)#转换后的结果可能为 Series
例如下列代码
import pandas as pd# 创建DataFrame
data = {'A': [1, 2, 3],'B': [4, 5, 6],'C': [7, 8, 9]
}
df = pd.DataFrame(data)# 将列转换为行
stacked = df.stack()
print(stacked)
其打印结果为:
![](https://i-blog.csdnimg.cn/direct/bb6715d6dc83455d8be7469ab3ca5501.png)
即stack函数将原本的DataFrame转换为了一个Series对象,每个元素的索引由原先的行索引和列索引组成。
1.2 长宽型格式的自由互转
df.unstack(level = -1 :需要处理的索引级别,默认为全部,int/string/listfill_value :用于填充缺失值的数值
)
例如下列代码演示:
import pandas as pd# 创建堆叠的数据
data = {('A', 'x'): [1, 2, 3],('A', 'y'): [4, 5, 6],('B', 'x'): [7, 8, 9],('B', 'y'): [10, 11, 12]
}
stacked = pd.DataFrame(data)# 将数据恢复为原始格式
unstacked = stacked.unstack()
print(unstacked)
其运行结果为:
![](https://i-blog.csdnimg.cn/direct/866a942db4874f7a8850d2454ff1d75a.png)
即unstack函数将原本的堆叠的数据恢复为了原始的DataFrame数据格式,每个列索引成为了多级的列索引。
1.3 数据转置: df.T
数据转置是将数据的行和列进行互换的操作。在Python中,可以通过使用pandas库的transpose()函数或T属性来实现数据的转置。如果df是一个pandas数据框(DataFrame),可以使用df.T来转置数据。
import pandas as pddata = {'A': [1, 2, 3],'B': [4, 5, 6],'C': [7, 8, 9]}
df = pd.DataFrame(data)print(df)
其打印结果为:
• 可以使用stack函数将列转换为索引:
stacked_df = df.stack()
print(stacked_df)
其输出结果如图所示:
• 可以使用unstack函数将索引转换为列:
unstacked_df = stacked_df.unstack()
print(unstacked_df)
此时转换会原来的结果:
2、多个数据源的合并
2.1 数据的纵向合并
concat函数 实现数据的纵向合并。默认情况下,concat按照行进行合并。
其具体函数属性以及用法如下:
pd.concat(objs :需要合并的对象,列表形式提供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'],})axis = 0 :对行还是对列方向逬行合并(0 index 、 1 columns )join = outer :对另一个轴向的索引值如何逬行处理(inner 、outer )ignore_index = Falsekeys = None :为不同数据源的提供合并后的索引值verify_integrity = False 是否检查索引值的唯一性,有重复时报错copy = True
)
2.1.1 一维series拼接
ser1=pd.Series([1,2,3],index=list('ABC'))
ser2=pd.Series([4,5,6],index=list('DEF'))
pd.concat([ser1,ser2])
2.1.2 df 对象拼接
import pandas as pddf1 = pd.DataFrame({'A': [1, 2, 3],'B': [4, 5, 6]})
df2 = pd.DataFrame({'A': [7, 8, 9],'B': [10, 11, 12]})
# 使用concat函数进行纵向合并
combined_df = pd.concat([df1, df2])
print(combined_df)
在这个例子中,df1和df2是两个具有相同列的DataFrame。通过使用concat函数并传入一个包含df1和df2的列表,可以将它们纵向合并为一个新的DataFrame。合并后的DataFrame保留了原始的行索引。
需要注意的是,如果两个DataFrame在列的数量或列名上有差异,那么合并时可能会出现缺失值。此时,可以使用参数axis=1来进行横向合并。
此时的生成结果为:
![](https://i-blog.csdnimg.cn/direct/b8e17cbb63d841b3b6f08e7bb328ed75.png)
可以使用reset_index重置一下第一列的索引,即下列代码
combined_df.reset_index(drop=True)
其中drop=True表示将生成的index列删除
2.1.3 两个df对象拼接,按行进行拼接
df1=make_df('AB',[1,2])
df2=make_df('AB',[3,4])
pd.concat([df1,df2],axis=1)
#或者
pd.concat([df1,df2],axis='columns')
2.1.4 两个df对象拼接,如果索引重复
x=make_df('AB',[1,2])
y=make_df('AB',[1,2])
pd.concat([x,y])
#解决索引重复问题加ignore_index属性
pd.concat([x,y],ignore_index=True)#重置索引
# #解决索引重复问题,加keys属性
pd.concat([x,y],keys=list('xy')) #复合索引
2.1.5 两个df对象拼接,join参数的使用
a=make_df('ABC',[1,2])
b=make_df('BCD',[3,4])
# pd.concat([a,b],join='inner')#内连接,只合并有相同列名的数据
pd.concat([a,b],join='outer')#外连接,合并所有的列
# a=make_df('ABC',[1,2,3,4])
# b=make_df('BCD',[3,4,5])
# pd.concat([a,b],join='outer',axis=1)#沿着y轴方向拼接
2.2 数据的横向合并
2.2.1 可以使用concat()函数
在其中的参数增加一个参数axis=1,即表示横向合并
import pandas as pd# 创建两个数据集
df1 = pd.DataFrame({'A': [1, 2, 3], 'B': [4, 5, 6]})
df2 = pd.DataFrame({'C': [7, 8, 9], 'D': [10, 11, 12]})# 使用 pd.concat() 函数横向合并
result = pd.concat([df1, df2], axis=1)print(result)
2.2.2 使用pd.merge()函数
函数属性及其用法为:
merge 命令使用像 SQL 的连接方式
pd.merge(需要合并的 DFleft :需要合并的左侧 DFright :需要合并的右侧 DFhow = ' inner':具体的连接类型{left、right 、outer 、 inner、)两个 DF 的连接方式on :用于连接两个 DF 的关键变量(多个时为列表),必须在两侧都出现left_on :左侧 DF 用于连接的关键变量(多个时为列表)right_on :右侧 DF 用于连接的关键变量(多个时为列表)left_index = False :是否将左侧 DF 的索引用于连接right_index = False :是否将右侧 DF 的索引用于连接
)
• 当两个数据有一列完全相同时
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'],})
result=pd.merge(left,right)
其生成结果为:
• left_on与right_on
即如果没有一个列相同的,则无法连接,需使用left_on与right_on来确定连接位置
import pandas as pd# 创建两个数据集
df1 = pd.DataFrame({'A': [1, 2, 3], 'B': [4, 5, 6]})
df2 = pd.DataFrame({'C': [7, 8, 9], 'D': [10, 11, 12]})# 使用 DataFrame.merge() 方法横向合并
result = df1.merge(df2, left_index=True, right_index=True)print(result)
其打印结果为:
• how参数的使用
#how参数的使用
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','k4'],'C':['C0','C1','C2','C3'],'D':['D0','D1','D2','D3'],})
result=pd.merge(left,right,how='left')
即当有一整列相同可以配对时,指定连接类型