3 回答
TA贡献1785条经验 获得超4个赞
IIUC 你有:
一堆 csv 文件,每个文件包含同一个实验的结果
第一个相关列始终包含从 0 到 40 的数字(因此每个文件有 41 行)
Wavelenght 和 Wavelength.1 列始终包含从 1100 到 1500 的相同值,增量为 10
但在第一个相关列之前可能存在其他列
第一列在 csv 文件中没有名称,直到第一个相关的名称以
'Unnamed: '
并且您想获得相同波长值的 S2 和 S2c 列的平均值。
groupby
这可以简单地用and完成mean
,但我们首先必须过滤掉所有不需要的列。可以通过 的index_col
andusecols
参数来实现read_csv
:
...
print(files_of_interests)
# first concat the datasets:
dfs = [pd.read_csv(os.path.join(dir, filename), index_col=1,
usecols=lambda x: not x.startswith('Unnamed: '))
for key in files_of_interests for filename in files_of_interests[key]]
df = pd.concat(dfs).reset_index()
# then take the averages
df = df.groupby(['Wavelength', 'Wavelength.1']).mean().reset_index()
# reorder columns and add 1 to the index to have it to run from 1 to 41
df = df.reindex(columns=['Wavelength', 'S2c', 'Wavelength.1', 'S2'])
df.index += 1
如果结果 df 中仍然有不需要的列,这个神奇的命令将有助于识别具有奇怪结构的原始文件:
import pprint
pprint.pprint([df.columns for df in files])
使用 github testfolder 中的文件,它给出:
[Index(['Unnamed: 0', 'Wavelength', 'S2c', 'Wavelength.1', 'S2'], dtype='object'),
Index(['Unnamed: 0', 'Wavelength', 'S2c', 'Wavelength.1', 'S2'], dtype='object'),
Index(['Unnamed: 0', 'Wavelength', 'S2c', 'Wavelength.1', 'S2'], dtype='object'),
Index(['Unnamed: 0', 'Wavelength', 'S2c', 'Wavelength.1', 'S2'], dtype='object'),
Index(['Unnamed: 0', 'Unnamed: 0.1', 'Wavelength', 'S2c', 'Wavelength.1',
'S2'],
dtype='object'),
Index(['Unnamed: 0', 'Wavelength', 'S2c', 'Wavelength.1', 'S2'], dtype='object')]
它明确表示第五个文件作为附加列。
TA贡献1850条经验 获得超11个赞
如果您有数据框列表,例如:
import pandas as pd
data = {'col_1': [3, 2, 1, 0], 'col_2': [3, 1, 2, 0]}
dflist = [pd.DataFrame.from_dict(data) for _ in range(5)]
你可以做:
pd.concat(dflist,axis=1)
这看起来像:
如果要在每个列名后附加一个数字,表明df
它们来自哪个列,在 之前concat
,请执行以下操作:
for index, df in enumerate(dflist): df.columns = [col+'_'+str(index) for col in df.columns]
然后pd.concat(dflist,axis=1)
,结果:
虽然我无法重现您的文件系统并确认它是否有效,但要从您的文件创建以上内容dflist,类似这样的方法应该有效:
dflist = []
for key in files_of_interests:
print(stack_df)
for filename in files_of_interests[key]:
dflist.append( pd.read_csv(os.path.join(dir, filename)) )
TA贡献1789条经验 获得超8个赞
想要的是:
键值对中每个文件的相应 S2c 和 S2 列将合并到一个
.csv
文件中以供进一步操作。删除冗余列以仅显示范围从 1100 到 1500 的单个列,
Wavelength
增量为 10。
这需要使用pd.concat
@zabop 和 @SergeBallesta 介绍的 which 如下所示:
for key in files_of_interests:
list = []
for filename in files_of_interests[key]:
list.append(pd.read_csv(os.path.join(dir,filename)))
df = pd.concat(list, axis = 1)
df = df.drop(['Unnamed: 0', 'Wavelength.1'], axis = 1)
print(df)
df.to_csv(os.path.join(dir + '/', f"{filename[:-5]}_master.csv"))
我必须使用files_of_interests[key]它才能读取文件名并且必须pd.read_csv读取正确的路径。除此之外,我添加axis = 1到pd.concatwhich 允许它与 for 循环一起水平连接以正确访问文件名。(我已经仔细检查了这些值,它们确实与相应的文件匹配.csv。)
输出.csv看起来像这样:
添加回答
举报