python - 合并数据框时按列分组
问题描述
我在 for 循环中将几个数据帧合并为一个数据帧。像这样的东西:
import pandas as pd
import numpy as np
df1 = pd.DataFrame(data=np.random.randint(0,100,(2,5)),columns=list('ABCDE'))
df2 = pd.DataFrame(data=np.random.randint(0,100,(2,5)),columns=list('GHABC'))
df1 = df1.merge(df2, how='outer', left_index=True, right_index=True,suffixes=('', '_' + 'second'))
每个数据框中的几列具有相似的名称,因此每次有这样的列时,我都会添加一个后缀。它变得一团糟。此外,我希望能够快速访问第一个表、第二个表等中的所有列。有没有办法合并这些列但将它们保持为一个组?这样我就不需要更改列名并且可以更轻松地访问每个数据集的所有列?
解决方案
这是一种在MultiIndex的帮助下水平合并数据帧的方法,与垂直合并相比,它具有一些优势。例如,您不会有很多字段,并且在水平合并的情况下,NaN
dtype 不会从int
变为喜欢。float
import numpy as np
import pandas as pd
df1 = pd.DataFrame(data=np.random.randint(0, 100, (2, 5)),
columns=list('ABCDE'))
df2 = pd.DataFrame(data=np.random.randint(0, 100, (2, 5)),
columns=list('GHABC'))
dfs = [df1, df2]
result = pd.concat(dfs, axis=1, keys=range(len(dfs)))
print(result)
这将给出:
0 1
A B C D E G H A B C
0 41 49 13 36 57 28 12 82 18 67
1 72 91 34 17 12 6 67 98 36 25
您可以循环访问每个组:
for source_index, df in result.groupby(axis=1, level=0):
print(df)
0
A B C D E
0 41 49 13 36 57
1 72 91 34 17 12
1
G H A B C
0 28 12 82 18 67
1 6 67 98 36 25
或单独:
gb = result.groupby(axis=1, level=0)
first_group = gb.get_group(0)
print(first_group)
0
A B C D E
0 41 49 13 36 57
1 72 91 34 17 12
参考:
推荐阅读
- oracle-ebs - ORA-00980: 同义词翻译不再有效 00980. 00000 - “同义词翻译不再有效”
- javascript - 在 CSV 文件的特定列中搜索包含带有 node.js 的字符串的前 n 个匹配项
- c++ - 64 位 Vivek 的虚拟相机
- openedge - 从另一个文件调用过程
- javascript - 从 JavaScript(浏览器)启动 Node.js 文件/模块
- sql-server-2008-r2 - SQL Server 作业间歇性失败,并在生产中出现错误“无法连接到 SQL Server '(本地)'步骤失败”
- android - Android 居中一个 TableLayout
- php - 在一组上传的文件上应用 php 代码
- php - 无法从 GODADDY 上托管的站点获取计算机的本地 IP 地址
- html - 如何使用当前部署的清单/资产自动更新 PWA