从多个文件构造dataframe,其中每个文件包含列数据

6yt4nkrj  于 2021-07-13  发布在  Java
关注(0)|答案(2)|浏览(278)

我有一个包含多个excel文件的文件夹

column B.xlsx
column A.xlsx
column C.xlsx
...

**这些不是实际的文件名。实际的文件名比这个更具体

每个excel文件都包含我要创建的较大数据框中单个列的数据。文件的格式是这样的
a.xlsx列:

Date | ID | Mass | Units
1/21    A   5.10     g
2/21    B   5.12     g
3/21    C   5.11     g

b.xlsx列:

Date | ID | Mass | Units
1/21    A   6.10     g
2/21    B   6.12     g
3/21    C   6.11     g

我要创建的大型Dataframe如下所示:

ID | Column A | Column B | Column C|....
A     5.10        6.10
B     5.12        6.12    
C     5.11        6.11

将数据分配给正确的列是很重要的,但文件名中是数据对应于哪一列的唯一指示。
我写了这个代码,但必须有一个更好的方法

files=glob.glob(r"C:\my\directory/*.xlsx")

bigDF=pd.DataFrame(columns=["ID","A","B","C"])
temp=pd.read_excel(files[0])
bigDF["ID"]=temp["ID"]
for f in files:
    temp=pd.read_excel(f)
    if "A" in f:
        bigDF["A"]=temp["Mass"]
    elif "B" in f: 
        bigDF["B"]=temp["Mass"]
    elif "C" in f:
       bigDF["C"]=temp["Mass"]
62lalag4

62lalag41#


# get your files

files = glob.glob('*.xlsx')

# read your files set the index and locate the mass column

# use list comprehension to iterate through your dfs and concatenate them together

df = pd.concat([pd.read_excel(file).set_index('ID')['Mass'].rename(file.split('.')[0]) for file in files], axis=1)

上面的列表基本上是:


# iterate through your files

for file in files:
    # read each file into memory, set the index, select the Mass column,
    # then rename the column to the file name
    pd.read_excel(file).set_index('ID')['Mass'].rename(file.split('.'))[0]
wn9m85ua

wn9m85ua2#

使用merge and reduce-idea是获取所有Dataframe的子集,然后合并id列上的所有df。

from functools import reduce
use_cols =  ['ID', 'Mass']
data_frames =[df1,df2,df3,df4]
data_frames = [df[use_cols] for df in data_frames]
final_df = reduce(lambda left,right,: pd.merge(left,right,on=['ID'],
                                            how='outer'), data_frames)

要直接加载Dataframe列表中的Dataframe,请使用(在路径构造函数路径('.')中提供所需的路径表示当前目录)-

from pathlib import Path
data_frames = [pd.read_excel(xlsx_file,use_cols=['ID', 'Mass']) for xlsx_file in Path('.').glob('**/*.xlsx')] #you can convert this list comprehension to generator if required.

最后,要重命名列,可以使用-

new_cols  = [f'Column {i}' for i in range(len(final_df.columns.values[1:]))]
new_cols.insert(0,'ID')
final_df.columns = new_cols

相关问题