3 回答

TA貢獻(xiàn)1785條經(jīng)驗(yàn) 獲得超4個(gè)贊
IIUC 你有:
一堆 csv 文件,每個(gè)文件包含同一個(gè)實(shí)驗(yàn)的結(jié)果
第一個(gè)相關(guān)列始終包含從 0 到 40 的數(shù)字(因此每個(gè)文件有 41 行)
Wavelenght 和 Wavelength.1 列始終包含從 1100 到 1500 的相同值,增量為 10
但在第一個(gè)相關(guān)列之前可能存在其他列
第一列在 csv 文件中沒有名稱,直到第一個(gè)相關(guān)的名稱以
'Unnamed: '
并且您想獲得相同波長(zhǎng)值的 S2 和 S2c 列的平均值。
groupby
這可以簡(jiǎn)單地用and完成mean
,但我們首先必須過濾掉所有不需要的列??梢酝ㄟ^ 的index_col
andusecols
參數(shù)來實(shí)現(xiàn)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
如果結(jié)果 df 中仍然有不需要的列,這個(gè)神奇的命令將有助于識(shí)別具有奇怪結(jié)構(gòu)的原始文件:
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')]
它明確表示第五個(gè)文件作為附加列。

TA貢獻(xiàn)1850條經(jīng)驗(yàn) 獲得超11個(gè)贊
如果您有數(shù)據(jù)框列表,例如:
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)
這看起來像:
如果要在每個(gè)列名后附加一個(gè)數(shù)字,表明df
它們來自哪個(gè)列,在 之前concat
,請(qǐng)執(zhí)行以下操作:
for index, df in enumerate(dflist): df.columns = [col+'_'+str(index) for col in df.columns]
然后pd.concat(dflist,axis=1)
,結(jié)果:
雖然我無法重現(xiàn)您的文件系統(tǒng)并確認(rèn)它是否有效,但要從您的文件創(chuàng)建以上內(nèi)容dflist,類似這樣的方法應(yīng)該有效:
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貢獻(xiàn)1789條經(jīng)驗(yàn) 獲得超8個(gè)贊
想要的是:
鍵值對(duì)中每個(gè)文件的相應(yīng) S2c 和 S2 列將合并到一個(gè)
.csv
文件中以供進(jìn)一步操作。刪除冗余列以僅顯示范圍從 1100 到 1500 的單個(gè)列,
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 循環(huán)一起水平連接以正確訪問文件名。(我已經(jīng)仔細(xì)檢查了這些值,它們確實(shí)與相應(yīng)的文件匹配.csv。)
輸出.csv看起來像這樣:
添加回答
舉報(bào)