gpt4 book ai didi

python - 如何通过从内容相似的多个 .csv 文件导入数据来创建数据框?

转载 作者:行者123 更新时间:2023-12-04 15:21:26 25 4
gpt4 key购买 nike

几个小时以来,我一直在努力解决这个问题,但我似乎无法弄清楚。如果有任何帮助,我将不胜感激。

背景

我正在尝试通过 python 为我在学校的研究实验室自动化数据操作。从实验中,将生成一个包含 41 行数据(不包括标题)的 .csv 文件,如下所示。

enter image description here

有时,同一实验的多次运行会产生具有相同 header 的 .csv 文件,需要对它们取平均值以确保准确性。像这样具有相同行数和标题的东西:

enter image description here

到目前为止,我能够过滤基本名称以仅包含具有相同参数的 .csv 文件,并将它们添加到数据框中。但是,我的问题是我不知道如何继续获得平均值。

我当前的代码和输出

代码:

import pandas as pd
import os

dir = "/Users/luke/Desktop/testfolder"

files = os.listdir(dir)
files_of_interests = {}

for filename in files:
if filename[-4:] == '.csv':
key = filename[:-5]
files_of_interests.setdefault(key, [])
files_of_interests[key].append(filename)

print(files_of_interests)

for key in files_of_interests:
stack_df = pd.DataFrame()
print(stack_df)
for filename in files_of_interests[key]:
stack_df = stack_df.append(pd.read_csv(os.path.join(dir, filename)))
print(stack_df)

输出:

Empty DataFrame
Columns: []
Index: []
Unnamed: 0 Wavelength S2c Wavelength.1 S2
0 0 1100 0.000342 1100 0.000304
1 1 1110 0.000452 1110 0.000410
2 2 1120 0.000468 1120 0.000430
3 3 1130 0.000330 1130 0.000306
4 4 1140 0.000345 1140 0.000323
.. ... ... ... ... ...
36 36 1460 0.002120 1460 0.001773
37 37 1470 0.002065 1470 0.001693
38 38 1480 0.002514 1480 0.002019
39 39 1490 0.002505 1490 0.001967
40 40 1500 0.002461 1500 0.001891

[164 rows x 5 columns]

在这里提问!

所以我的问题是,如何让它分别向右追加每个 S2cS2

解释:

对于具有相同 header 名称的多个 .csv 文件,当我将其附加到列表时,它只是不断堆叠到前一个 .csv 文件的底部,这导致了 [164行 x 5 列] 来自上一节。我最初的想法是创建一个新的数据框,只从每个 .csv 文件中附加 S2cS2,而不是堆叠一个接一个,它将继续将它们作为新列附加到右侧。之后,我可以进行某种形式的 pandas 列操作,将它们相加并除以运行次数(这只是文件的数量,所以 len(files_of_interests[key]) 在第二个 FOR循环)。

我尝试过的

  1. 我尝试创建一个空数据框并使用 pd.DataFrame.from_records() 添加从 np.arange(1100,1500,10) 获取的列。并将 S2cS2 附加到数据框,如我在上一节中所述。发生了同样的问题,除此之外,它还产生了一堆 Nan 值,即使在进一步搜索之后我也没有足够的能力来处理这些值。

  2. 我已经阅读了此处发布的其他多个问题,许多人建议使用 pd.concat 但由于答案是针对不同情况量身定制的,我无法真正复制它,也不会这样做我是否能够理解它的文档,所以我停止了这条路。

预先感谢您的帮助!

附加信息

我在代码中使用 macOS 和 ATOM。

可以在此处找到 csv 文件!

github: https://github.com/teoyi/PROJECT-Automate-Research-Process

试用@zabop 方法

代码:

dflist = []
for key in files_of_interests:
for filename in files_of_interests[key]:
dflist.append(pd.read_csv(os.path.join(dir, filename)) )
concat = pd.concat(dflist, axis = 1)
concat.to_csv(dir + '/concat.csv')

输出:

enter image description here

尝试@SergeBallesta 方法

代码:

df = pd.concat([pd.read_csv(os.path.join(dir, filename))
for key in files_of_interests for filename in files_of_interests[key]])

df = df.groupby(['Unnamed: 0', 'Wavelength', 'Wavelength.1']).mean().reset_index()
df.to_csv(dir + '/try.csv')
print(df)

输出:

enter image description here

最佳答案

IIUC 你有:

  • 一堆csv文件,每个文件包含同一个实验的结果
  • 第一个相关列始终包含从 0 到 40 的数字(因此每个文件有 41 行)
  • Wavelenght 和 Wavelength.1 列始终包含从 1100 到 1500 的相同值,增量为 10
  • 在第一个相关列之前可能存在其他列
  • 第一列在 csv 文件中没有名称,直到 第一个相关 名称以 'Unnamed: '
  • 开头

并且您想获得相同波长值的 S2 和 S2c 列的平均值。

这可以通过 groupbymean 简单地完成,但我们首先必须过滤掉所有不需要的列。可以通过read_csvindex_colusecols参数来制作:

...
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')]

明确将第五个文件作为附加列。

关于python - 如何通过从内容相似的多个 .csv 文件导入数据来创建数据框?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63202798/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com