2016-08-14 24 views
1

Ich versuche, die Datenrahmenwerte als Zeilen anzufügen, aber sie als Spalten anzuhängen. Ich habe 32 Dateien, von denen ich die zweite Spalte (dataset_code) nehmen und anhängen möchte. Aber es schafft 32 Zeilen und 101 Spalten. Ich möchte 1 Spalte und 3232 Zeilen.Python Pandas Datafframe Zeilen anhängen

import pandas as pd 
import os 



source_directory = r'file_path' 

df_combined = pd.DataFrame(columns=["dataset_code"]) 

for file in os.listdir(source_directory): 
    if file.endswith(".csv"): 
      #Read the new CSV to a dataframe. 
      df = pd.read_csv(source_directory + '\\' + file) 
      df = df["dataset_code"] 
      df_combined=df_combined.append(df) 



print(df_combined) 
+1

Sind Sie sicher, dass die Spalten gleich sind? von 'append' [docs] (http://pandas.pydata.org/pandas-docs/stable/generated/pandas.DataFrame.append.html):" Füge Reihen von anderen an das Ende dieses Rahmens an und gebe einen neuen zurück Spalten, die nicht in diesem Rahmen sind, werden als neue Spalten hinzugefügt. " – DeepSpace

+0

ja, wenn ich Teilmenge df und drucke es, druckt es die entsprechende Spalte – PyNoob

Antwort

6

Sie haben bereits zwei ganz gute Antworten haben, aber lassen Sie mich ein paar Empfehlungen machen.

  1. Wenn Sie nur die dataset_code Spalte möchten, sagen pd.read_csv direkt (usecols=['dataset_code']) statt die gesamte Datei in den Speicher geladen nur die Datenrahmen sofort zur Teilmenge.
  2. Anstatt an einen anfänglich leeren Datenrahmen anzuhängen, sammeln Sie eine Liste von Datenrahmen und verketten sie am Ende auf einen Schlag. Das Hinzufügen von Zeilen zu einem Pandas DataFrame ist teuer (es muss ein ganz neues erstellen), so erstellt Ihr Ansatz 65 DataFrame s: eine am Anfang, eine beim Lesen jeder Datei, eine beim Anhängen jeder der letzteren — vielleicht sogar 32 mehr mit der Untermenge. Der Ansatz, den ich vorschlage, schafft nur 33 von ihnen und ist das übliche Idiom für diese Art des Imports. Hier

ist der Code:

import os 
import pandas as pd 

source_directory = r'file_path' 

dfs = [] 
for file in os.listdir(source_directory): 
    if file.endswith(".csv"): 
     df = pd.read_csv(os.join.path(source_directory, file), 
         usecols=['dataset_code']) 
     dfs.append(df) 

df_combined = pd.concat(dfs) 
+0

Danke Alberto, ich habe deine Antwort geändert, weil es die bessere Lösung ist – PyNoob

4

df["dataset_code"] ist ein Series, kein DataFrame. Da Sie einen DataFrame an einen anderen anhängen möchten, müssen Sie das Series-Objekt in ein DataFrame-Objekt ändern.

>>> type(df) 
<class 'pandas.core.frame.DataFrame'> 
>>> type(df['dataset_code']) 
<class 'pandas.core.series.Series'> 

Um die Konvertierung zu machen, dies zu tun:

df = df["dataset_code"].to_frame() 
+0

hey Nehal, das hat funktioniert, danke !! Aber warum hat es funktioniert? Kannst du mir helfen zu verstehen? – PyNoob

+0

@PyNoob Ich habe die Antwort aktualisiert. –

3

Alternativ können Sie einen Datenrahmen mit doppelten eckigen Klammern erstellen:

df = df[["dataset_code"]] 
+0

Schön, danke Parfait – PyNoob