2017-01-25 2 views
0

Ich habe 3 CSV-Dateien namens file1, file2, file3. Jede CSV wird mit 3 Spalten und 5653 Zeilen gefüllt:Berechnen Mittelwert für jede CSV Zeile

1 0 -95 
2 0 -94 
3 0 -93 
... 
51 0 -93 
0 1 -92 
1 1 -91 
2 1 -90 
.. 

erste Spalte ist ein X-Variable zweite ist ein y-Variable, 3. ist ein Messwert, von dem ich den Mittelwert haben will.

Was ich tun möchte, ist:

  • erste Zeile der Datei 1
  • erste Reihe der Datei 2
  • las erste Reihe der Datei 3 und dann zählt den Mittelwert des Messwerts lesen lesen .

So zum Beispiel:

file1 row1 -98 
file2 row1 -97 
file3 row1 -95 

mean 96,666666667 

Ich möchte, dass in eine neue CSV-Datei

1,0,mean_of_row1 (which would be 96,666666667) 
2,0,mean_of_row2 
3,0,mean_of_row3 
4,0,mean_of_row4 

derzeit in der Lage im, bedeuten, schreiben den Mittelwert der Messsäule zu berechnen mit dem folgenden Format von jeder Datei und speichern Sie es als Zeile in einer Ergebnisdatei

import pandas as pd 
import numpy as np 

csv_file_list = ["file1.csv", "file2.csv", "file3.csv"] 
result_csv = "result.csv" 

with open(result_csv, 'wb') as rf: 
    for idx, csv_file in enumerate(csv_file_list): 
     csv_data = pd.read_csv(csv_file).values 
     mean_measured = np.mean(csv_data[:, 2]) 
     rf.write(','.join([str(0), str(idx), str(mean_measured)+"\n"])) 

Aber wie kann ich meine Absicht erfüllen? Vielen Dank

Antwort

1

In dieser Situation ist Pandas sehr hilfreich. Sie können alle Schleifen vermeiden und CSV in Datenrahmen sauber lesen. Dann verbinden Sie alle drei Datenfelder zu einem und berechnen Sie die pandas.DataFrame.mean der erforderlichen Felder in Zeilenweise.

pandas.read_csv hat die Option, die Anzahl der Zeilen mit dem Parameter nrows zu begrenzen.

import pandas as pd 

df1=pd.read_csv('file1.txt',names=['x1','Y1','Value1'],nrows=5356) 
df2=pd.read_csv('file2.txt',names=['x2','Y2','Value2'],nrows=5356) 
df3=pd.read_csv('text3.txt',names=['x3','Y3','Value3'],nrows=5356) 

df_concat= pd.concat([df1,df2,df3], axis=1) 
print df_concat 


df_concat['meanvalue']=df_concat[['Value1','Value2','Value3']].mean(axis=1) 
print(df_concat.to_csv(columns=['meanvalue'],index=False)) 

Ausgang

meanvalue 
-96.5 
-97.0 
-86.0 
-95.0 
+0

ich müsste dies für 5000 Zeilen tun ... – Skat1337

+0

das sollte in Ordnung sein, wenn Sie genug Speicher haben – Shijo

+0

gibt es eine Möglichkeit, nur den Mittelwert zu drucken? wie drucke df_concat ['meanvalue'] ohne den Index? – Skat1337

1

Sie können nur eine große Pandas-Tabelle in diesem Fall mit join machen. Der Join-Wert muss der Index des jeweiligen Datenrahmens sein.

Auf diese Weise können Sie verbinden, wo der x- und y-Wert gleich sind. Sie erhalten 5 Spalten x, y und die folgenden 3 Spalten sind Ihre Werte, aus denen Sie berechnen möchten. Jetzt können Sie einfach eine neue Spalte erstellen, die den Mittelwert über die letzten 3 Werte in einer Zeile für den Datenrahmen misst. x oder y, was auch immer einzigartig ist, kann als Index verwendet werden.

Die Pandas merge Funktion sollte Ihnen helfen, basierend auf den Zeilen selbst zusammenzuführen.

Das SQL-Äquivalent zu dem, was Sie tun, ist ein innerer Join auf den y-Werten, von denen ich annehme, dass sie pro CSV-Datei eindeutig sind.

+0

Aber wie bin ich in der Lage eine Reihe von einer bestimmten Spalte zu lesen? Wie Row1 Column2 Row2 Column2 mit 'np.mean (csv_data [:, 2])' schaut es nur in die Spalten – Skat1337

+0

[Diese Antwort] (http://stackoverflow.com/questions/34734940/in-pandas-how-to -get-average-of-mehrere-Spalten-Werte-für-jede-Zeile-in-Daten-fram) sollte Ihnen helfen, den Durchschnitt über Spalten zu nehmen. – Fruitspunchsamurai

Verwandte Themen