Averaging out every four elements in a CSV file

Viewed 42

I have a CSV file with, say $n=100$ elements. So the file looks like a $n$-dimensional vector. The question is: how can I average every 4 elements and save the results in a new csv file?

For example I generate a list of random numbers:

import random
my_random_list = []
for i in range(0,9):
    n = random.randint(1,100)
    my_random_list.append(n)

df = pd.DataFrame(my_random_list)
df.to_csv('my_csv.csv', index=False, header=None)

This is similar to my code. Now, I want create a new csv (because I have the data in csv form already) where I average out and save the first 4 elements, then the next 4, etc. So I will end up with a csv file with only 25 elements.

2 Answers

Use DataFrame.groupby with integer division of index for groups of 4 values and aggregate mean:

np.random.seed(2021)

df = pd.DataFrame({'a':np.random.randint(1,10, size=10)})
print (df)
   a
0  5
1  6
2  1
3  7
4  6
5  9
6  7
7  7
8  7
9  7

df1 = df.groupby(df.index // 4).mean()
print (df1)
      a
0  4.75
1  7.25
2  7.00

Detail:

print (df.index // 4)
Int64Index([0, 0, 0, 0, 1, 1, 1, 1, 2, 2], dtype='int64')

All together:

df = pd.read_csv(file, header=None)
df1 = df.groupby(df.index // 4).mean()
df1.to_csv('my_csv.csv', index=False, header=None)
    
import pandas as pd
import random
import csv

# FIRST PART -- GENERATES THE ORIGINAL CSV FILE

my_random_list = []
for i in range(0,100):
    n = random.randint(1,100)
    my_random_list.append(n)

df = pd.DataFrame(my_random_list)
df.to_csv('my_csv.csv', index=False, header=None)

# SECOND PART -- POPULATES A LIST WITH THE CONTENTS OF THE
#                ORIGINAL CSV FILE

file_CSV = open('my_csv.csv')
data_CSV = csv.reader(file_CSV)
list_CSV = list(data_CSV)


# THIRD PART -- GENERATES A NEW LIST CONTAINING
#               THE AVERAGE OF EVERY FOURTH ELEMENT
#               AND ITS THREE PREDECESSORS

new_list = []
for i in range(0,len(list_CSV)):
    if(i%4==0):
        s =     int(list_CSV[i+0][0])
        s = s + int(list_CSV[i+1][0])
        s = s + int(list_CSV[i+2][0])
        s = s + int(list_CSV[i+3][0])
        s = s/4
        new_list.append(s)
    i = i + 1

# FOURTH PART -- GENERATES A NEW CSV

df = pd.DataFrame(new_list)
df.to_csv('new_csv.csv', index=False, header=None)
Related