醒醒,别睡了...讲《数据分析pandas库》了—/—<6>

一、

1、长宽格式转换

        基于多重索引,Pandas 可以很容易地完成长型、宽型数据格式的相互转换。
1.1 转换为最简格式

stack()其使用法如下:

        stack函数用于将DataFrame中的列转换为行,即将宽格式数据转换为长格式数据。

df.stack(
    level = -1 :需要处理的索引级别,默认为全部,int/string/list
    dropna = 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)
其打印结果为:
即stack函数将原本的DataFrame转换为了一个Series对象,每个元素的索引由原先的行索引和列索引组成。
1.2 长宽型格式的自由互转
df.unstack(
    level = -1 :需要处理的索引级别,默认为全部,int/string/list
    fill_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)
其运行结果为:
即unstack函数将原本的堆叠的数据恢复为了原始的DataFrame数据格式,每个列索引成为了多级的列索引。
1.3 数据转置: df.T

        数据转置是将数据的行和列进行互换的操作。在Python中,可以通过使用pandas库的transpose()函数或T属性来实现数据的转置。如果df是一个pandas数据框(DataFrame),可以使用df.T来转置数据。

import pandas as pd

data = {'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 = False
    keys = 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 pd

df1 = 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来进行横向合并。

此时的生成结果为:
可以使用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(
    需要合并的 DF
    left :需要合并的左侧 DF
    right :需要合并的右侧 DF
    how = ' 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')

即当有一整列相同可以配对时,指定连接类型

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

菜就多练_0828

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值