看过来
《pandas 教程》 持续更新中,提供建议、纠错、催更等加作者微信: gairuo123(备注:pandas教程)和关注公众号「盖若」ID: gairuo。跟作者学习,请进入 Python学习课程。欢迎关注作者出版的书籍:《深入浅出Pandas》 和 《Python之光》。
本需求是将相同数据结构的数据合并到一起,就是说在一批 DataFrame 中将有相同表头(列名)的 DataFrame 合并到一起。我们将用到 DataFrame 的高级功能,将 DataFrame 数据存在 DataFrame 中。
有以下一批 DataFrame:
import pandas as pd
df1 = pd.DataFrame({'a':[12],'d':[35]})
df2 = pd.DataFrame({'b':[13]})
df3 = pd.DataFrame({'a':[25],'d':[35]})
df4 = pd.DataFrame({'b':[28]})
dflist = [df1, df2, df3, df4]
# 查看每个 DataFrame 的内容
[print(i, end=f'\n-----\n') for i in dflist]
'''
a d
0 12 35
-----
b
0 13
-----
a d
0 25 35
-----
b
0 28
-----
'''
我们看到 df1、df3 和 df2、df4 的表头相同,需要将它们合并在一起。以上的 dflist 中的数据只是一个样例,实际 dflist 的长度是不确定的,比如我们可以用 pd.read_excel()
读取得到。
我们将 dflist 的存入 DataFrame 中的一列中,该列的每个数据存放一个 DataFrame,然后增加一个辅助列,将对应 DataFrame 的表头提取出来形成一个表头列,最后将这个表头列进行分组,分组后将同组的 DataFrame 构造为一个列表,以后我们用 pd.concat
进行合并。
将所有的 DataFrame 放一 data 列,形成一个 DataFrame:
df = pd.DataFrame({'data': dflist})
df.dtypes
'''
data object
dtype: object
'''
# 测试:第一个数据类型
type(df.iat[0,0])
# pandas.core.frame.DataFrame
提取表头:
df.assign(col=df.data.transform(tuple))
'''
data col
0 <DataFrame> (a, d)
1 <DataFrame> (b,)
2 <DataFrame> (a, d)
3 <DataFrame> (b,)
'''
# 注 <DataFrame> 以实际显示为准
# 以上相当于
df.assign(col=df.data.map(lambda x: tuple(x.columns)))
对表头列 col 进行分组,并将同组内容构造成列表:
(
df.assign(col=df.data.map(tuple))
.groupby('col')
.agg(list) # 将同表头的 DataFrame 合并为一个列表,方便合并
)
'''
data
col
(a, d) [<DataFrame>, <DataFrame>]
(b,) [<DataFrame>, <DataFrame>]
'''
# 注 <DataFrame> 以实际显示为准
将分组后的同列名 DataFrame 进行合并:
(
df.assign(col=df.data.map(tuple))
.groupby('col')
.agg(list) # 将同表头的 DataFrame 合并为一个列表,方便合并
.data
.map(pd.concat) # 合并
)
'''
data
col
(a, d) <DataFrame>
(b,) <DataFrame>
# 注 <DataFrame> 为合并完成的 DataFrame 以实际显示为准
'''
合并后有两组,合并为两个 DataFrame,我们可以取出期中一个测试一下:
# 合并
(
df.assign(col=df.data.map(tuple))
.groupby('col')
.agg(list) # 将同表头的 DataFrame 合并为一个列表,方便合并
.data
.map(pd.concat) # 合并
# .index
.iat[0] # 共两行,看看第一行合并的数据
)
'''
a d
0 12 35
0 25 35
'''
最后我们可以根据需要取对应表头合并的数据。
如果想将合并的 DataFrame 导出为 Excel ,则有两种办法:
一是分别导出为独立的 Excel:
(
df.assign(col=df.data.map(tuple))
.groupby('col')
.agg(list) # 将同表头的 DataFrame 合并为一个列表,方便合并
.data
.map(pd.concat) # 合并
.map(lambda x: x.to_excel(f'052/{''.join(x.columns)}.xlsx'))
)
还有是导出一个 Excel,数据在不同的标签页:
with pd.ExcelWriter('052/abd.xlsx') as writer:
(
df.assign(col=df.data.map(tuple))
.groupby('col')
.agg(list) # 将同表头的 DataFrame 合并为一个列表,方便合并
.data
.map(pd.concat) # 合并
.map(lambda x: x.to_excel(writer, sheet_name=''.join(x.columns)))
)
DataFrame 可以存放 Python 对象,就是任意类型的 Python 数据,包括 DataFrame 也可以存入 DataFrame,数据类型就是 object,不过我们平时把它理解成文本或者混杂类型。
(完)
更新时间:2024-08-18 15:55:41 标签:python pandas dataframe 合并