python - 如何附加多个 CSV 文件并创建 MultiIndex 数据框
问题描述
我在一个文件夹中有多个 csv 文件。目标是将 csv 文件附加到单个 pd 帧中。
问题是我们如何使用 pandas 连接文件夹中的所有文件,但同时使用 keys 参数将特定键与切碎的 DataFrame 的每个片段相关联keys
:
这意味着我们现在可以按键选择每个块:
例如,给定一个文件夹中的两个 csv 文件,每个 csv 有 3 列(A、B、C)和两行。
CSV 文件:Book1
A0 B0 C0
A1 B1 C1
和
CSV 文件:Book2
A2 B2 C2
A3 B3 C3
预期的帧如图所示。
请注意左侧列中的索引 Book1 和 Book2。此名称来自上述 csv 文件。
到目前为止,我有以下代码
# match the pattern ‘csv’ in the folder
extension = 'csv'
all_filenames = [i for i in glob.glob('*.{}'.format(extension))]
但是在下面的代码行下我需要更改以实现上述目标?
combined_csv = pd.concat([pd.read_csv(f) for f in all_filenames ])
添加此密钥的原因是为了方便将来访问。这通常可以从
.loc['Book1']
解决方案
您可以使用方法为每个数据框添加一个额外的列assign
;这可以在它们被读取之后和连接之前完成
combined_csv = pd.concat([pd.read_csv(f).assign(name=f) for f in all_filenames ])
这将添加name
所有值等于 file name 的列f
。
当所有数据集连接时,您可以设置MultiIndex
combined_csv.reset_index(drop=True, inplace=True)
combined_csv.set_index([combined_csv.name, combined_csv.index], inplace=True)
推荐阅读
- python - 授权代码流中的错误请求 Spotify
- java - 将数组作为参数传递;使用扫描器类在 Java 中使用用户输入设置数组
- python - 如何在 Python 中连接多个(超过 2 个)二维数组?
- azure-devops - Azure devops 管道:无法使用 SourceVersion 变量部署特定变更集
- html - 如何将元素与容器的顶部和底部对齐?
- javascript - 是否可以将 D3.tree() 与包含父母而不是孩子的数据集一起使用?
- environment-variables - Postman 中的环境变量
- java - Android ListView 项目太大不知道为什么
- c++ - 强制 CMake 重建预编译的头文件
- java - 运行 docker 容器“NoClassDefFoundError”时出错