【发布时间】:2020-08-12 06:10:48
【问题描述】:
这几天我一直在思考这个问题:
- 我在 csv 文件中有几个数据帧,它们具有所有相同的格式(列名、行名),我想计算每个文件每一行的平均值,然后将其保存在输出 csv 文件中。就像这样:
import glob
import csv
with open('result.csv', 'w', newline='') as f_output:
csv_output = csv.writer(f_output)
for filename in glob.glob('F*.csv'):
print (filename)
with open (filename, newline='') as f_input:
csv_input = csv.reader(f_input)
header = next(csv_input)
averages = [] #making a list for averages
for col in zip(*csv_input):
averages.append(sum(float(x) for (x) in col) / len(col))
csv_output.writerow([filename] + averages)
- 但实际上我需要每 18 行(因为每行 = 1 分钟)每个数据帧的每个列的平均值,不包括标题(因为那是一个字符串)。所以我一直试图在 for 循环中只选择前 18 行这样的内容
df = pd.read_csv(df,skiprows=0, nrows = 18) #to get only first 18 minutes'
但这是 1)不起作用(我认为因为它不适用于读者) 2)不理想,因为我实际上只想将所有 dfs 分成 18 行的块,然后计算每行的平均值。
任何提示都会非常有帮助,谢谢!
更新
“也许您可以向我们展示一个小样本数据框(包含 4-5 列和行)并向我们展示您想要的输出(假设您需要每 2 行而不是每 18 行)。”
这是每个文件的示例 df
col1 col2 col3 col4 col5 col6
0 1.228516 61.228516 1.0 418.808284 957.419867 1025.554374
1 61.228516 121.228516 1.0 207.864712 694.581742 814.149004
2 121.228516 181.228516 1.0 140.516367 370.653176 809.100268
3 181.228516 241.228516 1.0 140.274964 448.755593 885.196647
4 241.228516 301.228516 1.0 117.079110 312.173256 1907.873698
我想计算每个列的前两行 (0,1) 的平均值,我们在这里说 forl col6。 所以我的输出将是 (1025.554374+814.149004)/2 #definition of算术平均值。
我只需要在我的所有 csv 文件中使用它,但每 18 行
希望现在更清楚了,谢谢!
【问题讨论】:
-
欢迎来到 SO,@Vera!听起来您有两个不同的问题:读取文件和分块计算均值。读取文件时出了什么问题?
-
另外,不清楚是否要每一行的平均值(“我要计算每一行的平均值”),每一列(“我实际上需要每列的平均值[n] "),或者每 18 行这些东西的某个版本。也许您可以向我们展示一个小样本数据框(包含 4-5 列和行)并向我们展示您想要的输出(假设您希望每 2 行而不是每 18 行输出一次)。
-
嗨@ASGM,感谢您的快速回复!读取文件在 for 循环中工作正常,但我不知道如何集成(以及如何编写)将每个 csv 文件拆分为 18 行块的函数。如果我在 for 循环中导入文件时可以这样做,那将是理想的。请参阅我对上面第二个问题的回答
-
非常感谢@ASGM,您的解释为我解决了问题!我正在尝试添加新的代码行,在输出中告知平均值属于每 4 行(0、1、2、3)的文件。
标签: python pandas csv dataframe mean