Python:从字典元素的DataFrame提取列及多CSV公共列提取
解决多CSV文件提取共同列并转数组的问题
嘿,我来帮你搞定这个需求!你已经把CSV文件都存进字典里的DataFrame了,这步做得相当到位,接下来咱们一步步实现找出共同列、提取成数组的功能。
第一步:找出所有文件共有的列标题
首先咱们得先确定哪些列是所有CSV文件都有的,这里用集合的交集操作最方便:
# 假设你的DataFrame字典名叫dfs(比如你循环读取时存在这个字典里) # 先把每个DataFrame的列名转成集合,存进列表 all_col_sets = [set(df.columns) for df in dfs.values()] # 计算所有集合的交集,得到所有文件都有的列 common_cols = set.intersection(*all_col_sets) # 转成列表方便后续索引 common_cols = list(common_cols)
如果担心没有共同列的情况,可以加个小判断:
if not common_cols: print("哎呀,所有文件没有共同的列标题哦!") else: print(f"找到的共同列:{common_cols}") # 这里继续后续操作
第二步:提取共同列数据为数组
接下来就可以遍历字典里的每个DataFrame,提取这些共同列的数据,转成你需要的数组(比如numpy数组):
方式1:每个文件的共同列存为单独的数组(存在列表里)
# 存储每个文件的共同列数据数组 common_data_arrays = [] for df in dfs.values(): # 提取共同列,转成numpy数组 data_array = df[common_cols].to_numpy() common_data_arrays.append(data_array) # 比如要查看第一个文件的共同列数组,直接取common_data_arrays[0]就行
方式2:把所有文件的共同列数据拼接成一个大数组
如果需要把所有数据合并到一起,可以用pd.concat拼接后再转数组:
# 拼接所有DataFrame的共同列,再转成numpy数组 combined_array = pd.concat([df[common_cols] for df in dfs.values()]).to_numpy()
结合你现有代码的完整示例
把这些逻辑整合到你已有的代码里,大概是这样:
import numpy as np import pandas as pd r = int(input('How many files do you want to import? ')) dfs = {} # 用来存储每个CSV对应的DataFrame # 循环读取文件到字典 for i in range(r): file_path = input(f"请输入第{i+1}个文件的路径:") dfs[i] = pd.read_csv(file_path) # 找共同列 all_col_sets = [set(df.columns) for df in dfs.values()] common_cols = set.intersection(*all_col_sets) common_cols = list(common_cols) if not common_cols: print("所有文件没有共同的列标题!") else: print(f"找到的共同列:{common_cols}") # 提取每个文件的共同列数据为数组 common_data_arrays = [df[common_cols].to_numpy() for df in dfs.values()] # 示例:打印第一个文件的共同列数组 print("\n第一个文件的共同列数据:") print(common_data_arrays[0])
这样就能轻松完成你要的功能啦,要是有其他细节调整的需求,比如数组的格式、要不要保留列名之类的,随时改就行~
内容的提问来源于stack exchange,提问作者Blake Moss
相关产品推荐
相关产品推荐

