2016-11-16 2 views
5

Eine einzelne Zeile eines DataFrame gibt den Wert nebeneinander aus, d. H. Spalte_Name dann Spalte_Wert in einer Zeile und nächste Zeile enthält Spalte_Name und Spalten_Wert. Beispielsweise unterhalb CodePandas DataFrame: Wie wird eine Zeile horizontal gedruckt?

import pandas as pd 

df = pd.DataFrame([[100,200,300],[400,500,600]]) 
for index, row in df.iterrows(): 
    # other operations goes here.... 
    print row 

Ausgang für die erste Reihe kommt als

0 100 
1 200 
2 300 
Name: 0, dtype: int64  

Gibt es eine Möglichkeit jede Reihe horizontal drucken zu lassen und den Datentyp, Namen ignorieren? Beispiel für die erste Reihe:

0 1 2 
100 200 300 

Antwort

5

verwenden die to_frame Methode dann mit T

df = pd.DataFrame([[100,200,300],[400,500,600]]) 
for index, row in df.iterrows(): 
    print(row.to_frame().T) 

    0 1 2 
0 100 200 300 
    0 1 2 
1 400 500 600 

Note transponieren:
Dies ist ähnlich @ Antwort des JohnE, dass das Verfahren to_frame ist syntaktischer Zucker um pd.DataFrame.

In der Tat, wenn wir follow the code

def to_frame(self, name=None): 
    """ 
    Convert Series to DataFrame 
    Parameters 
    ---------- 
    name : object, default None 
     The passed name should substitute for the series name (if it has 
     one). 
    Returns 
    ------- 
    data_frame : DataFrame 
    """ 
    if name is None: 
     df = self._constructor_expanddim(self) 
    else: 
     df = self._constructor_expanddim({name: self}) 

    return df 

Punkte _constructor_expanddim

@property 
def _constructor_expanddim(self): 
    from pandas.core.frame import DataFrame 
    return DataFrame 

die Sie einfach sehen können, gibt die abrufbaren DataFrame

+0

@JohnE Ich habe meinen Beitrag bearbeitet. – piRSquared

+0

Danke! Das war eine großartige Erholung ;-) Und sehr gute Erklärung für den Unterschied. – JohnE

3

Verwenden Sie die Transponierung Eigenschaft:

df.T 

    0 1 2 
0 100 200 300 
+0

Was passiert, wenn df mehrere Zeilen wie df = pd.DataFrame hat ([100,200,300], [400,500,600]]). Wie kann jede Zeile so gedruckt werden? – gmsi

+0

Ändern Sie Ihre OP reflektieren Sie diesen Teil der Frage und Ihre erwartete Ausgabe mit einem solchen Datenrahmen – Boud

+0

Aktualisiert die Frage. Danke – gmsi

3

Es sollte wie es scheint eine einfachere Antwort auf diese Frage, aber versuchen Sie es in einen anderen Datenrahmen mit einer Reihe drehen.

data = {x: y for x, y in zip(df.columns, df.iloc[0])} 
sf = pd.DataFrame(data, index=[0]) 
print(sf.to_string()) 
2

Sorta die beiden bisherigen Antworten kombiniert, können Sie tun:

for index, ser in df.iterrows(): 
    print(pd.DataFrame(ser).T) 

    0 1 2 
0 100 200 300 
    0 1 2 
1 400 500 600 

Im Grunde, was passiert ist, dass, wenn Sie eine Zeile oder Spalte aus einem Datenrahmen zu extrahieren, erhalten Sie eine Serie, die als Spalte zeigt . Und es macht nichts, wenn Sie ser oder ser.T tun, es "sieht" wie eine Spalte aus. Ich meine, Serien sind eindimensional, nicht zwei, aber Sie bekommen den Punkt ...

Also sowieso, Sie können die Serie in einen Datenrahmen mit einer Zeile konvertieren. (Ich habe den Namen von "row" in "ser" geändert, um zu betonen, was oben passiert.) Der Schlüssel ist, dass Sie zuerst in einen Datenrahmen konvertieren müssen (der standardmäßig eine Spalte ist), dann transponieren Sie ihn.

+0

Ich benutze oft eine Rekonstruktion, um Probleme zu lösen. plus eins von mir. – piRSquared

Verwandte Themen