使用 pandas 合并 excel 文件数据
Using pandas to combine excel file data
所以,我目前正在进行一个项目,该项目生成 excel 文件,其中包含用于制作光谱的数据(即一列中的波长,另一列中的吸光度)。这种性质的文件有数百个 excel,我希望将它们压缩成一个文件。这主要是因为 A 列(波长)对于所有文件都是相同的,并且只有文件之间的吸光度机会。因此,我想从目录中的第一个文件中获取列 A 和 B,将它们写入新的 excel sheet,然后仅从所有剩余的 sheet 中获取列 B 和将它们打印到相同的输出 excel 文件。我目前的代码是:
import os
import pandas as pd
from pandas import ExcelWriter
from pandas import ExcelFile
import glob
import numpy as np
def xlxtract():
for filename in glob.glob('*.xlsx'):
ExcelFile = filename[:-5]
RosewoodData = pd.read_excel(ExcelFile + '.xlsx')
Row = RosewoodData.values.tolist()
ColDataFrame = pd.DataFrame({'Wavelength (nm)': [ x[0] for x in Row], 'Absorbance':[ x[1] for x in Row]})
Writer = ExcelWriter(filename[:-5] + 'TEST' + '.xlsx')
ColDataFrame.to_excel(Writer, 'Sheet1', index=False)
Writer.save()
xlxtract()
我知道我的代码目前只读取所有文件并创建一个名称相似的单独文件,同时将完全相同的数据打印到新文件并且只添加一个列名称。
如果有人能为我指出正确的研究方向,我非常乐意亲自调查这个问题,但解决这个问题的方法也很好。
你可能会这样做:
import pandas as pd
import glob
filelist = glob.glob('*.xlsx')
df_list = []
for file in filelist:
df_temp = pd.read_excel(file, index_col=0)
df_list.append(df_temp)
df = pd.concat(df_list)
df.to_excel('output.xlsx')
这会将所有 excel 文件读取到一个单独的 DataFrame 中,第一列(波长)作为索引。创建完所有 DataFrame 后,pd.concat 将它们合并为 1 个 DataFrame,以 Wavelength 列作为连接键。
我相信,正如@Rahul 上面提到的,您需要的是函数merge。有了它,您可以轻松地组合基于公共列的数据框。您可以查看更多信息 here。另外,对于您的具体情况,我想这附近的一些东西应该可以解决问题:
import os
import pandas as pd
import glob
import numpy as np
def xlxtract():
masterDf = pd.DataFrame(columns=["Wavelength (nm)"])
minorDf = pd.DataFrame(columns=["Wavelength (nm)", "Absorvance"])
for filename in glob.glob('*.xlsx'):
minorDf = pd.read_excel(filename)
masterDf = minorDf.merge(masterDf, how = 'outer', on= "Wavelength (nm)")
masterDf.to_excel("result.xlsx")
所以,我目前正在进行一个项目,该项目生成 excel 文件,其中包含用于制作光谱的数据(即一列中的波长,另一列中的吸光度)。这种性质的文件有数百个 excel,我希望将它们压缩成一个文件。这主要是因为 A 列(波长)对于所有文件都是相同的,并且只有文件之间的吸光度机会。因此,我想从目录中的第一个文件中获取列 A 和 B,将它们写入新的 excel sheet,然后仅从所有剩余的 sheet 中获取列 B 和将它们打印到相同的输出 excel 文件。我目前的代码是:
import os
import pandas as pd
from pandas import ExcelWriter
from pandas import ExcelFile
import glob
import numpy as np
def xlxtract():
for filename in glob.glob('*.xlsx'):
ExcelFile = filename[:-5]
RosewoodData = pd.read_excel(ExcelFile + '.xlsx')
Row = RosewoodData.values.tolist()
ColDataFrame = pd.DataFrame({'Wavelength (nm)': [ x[0] for x in Row], 'Absorbance':[ x[1] for x in Row]})
Writer = ExcelWriter(filename[:-5] + 'TEST' + '.xlsx')
ColDataFrame.to_excel(Writer, 'Sheet1', index=False)
Writer.save()
xlxtract()
我知道我的代码目前只读取所有文件并创建一个名称相似的单独文件,同时将完全相同的数据打印到新文件并且只添加一个列名称。
如果有人能为我指出正确的研究方向,我非常乐意亲自调查这个问题,但解决这个问题的方法也很好。
你可能会这样做:
import pandas as pd
import glob
filelist = glob.glob('*.xlsx')
df_list = []
for file in filelist:
df_temp = pd.read_excel(file, index_col=0)
df_list.append(df_temp)
df = pd.concat(df_list)
df.to_excel('output.xlsx')
这会将所有 excel 文件读取到一个单独的 DataFrame 中,第一列(波长)作为索引。创建完所有 DataFrame 后,pd.concat 将它们合并为 1 个 DataFrame,以 Wavelength 列作为连接键。
我相信,正如@Rahul 上面提到的,您需要的是函数merge。有了它,您可以轻松地组合基于公共列的数据框。您可以查看更多信息 here。另外,对于您的具体情况,我想这附近的一些东西应该可以解决问题:
import os
import pandas as pd
import glob
import numpy as np
def xlxtract():
masterDf = pd.DataFrame(columns=["Wavelength (nm)"])
minorDf = pd.DataFrame(columns=["Wavelength (nm)", "Absorvance"])
for filename in glob.glob('*.xlsx'):
minorDf = pd.read_excel(filename)
masterDf = minorDf.merge(masterDf, how = 'outer', on= "Wavelength (nm)")
masterDf.to_excel("result.xlsx")