Hübsches Drucken von Zeilen in einem String in einem Pandas DataFrame

Ich habe einen Pandas DataFrame, in dem eine der Spalten String-Elemente enthält, und diese String-Elemente enthalten neue Zeilen, die ich buchstäblich drucken möchte. Aber sie erscheinen einfach als \n in der Ausgabe.

Das heißt, ich möchte das drucken:

  pos bidder 0 1 1 2 2 3 <- alice <- bob 3 4 

Aber das bekomme ich:

  pos bidder 0 1 1 2 2 3 <- alice\n<- bob 3 4 

Wie kann ich das erreichen, was ich will? Kann ich ein DataFrame verwenden, oder muss ich wieder auf manuelles Drucken von gepolsterten Spalten eine Zeile zu einem Zeitpunkt zurückkehren?

Hier ist was ich bisher habe

 n = 4 output = pd.DataFrame({ 'pos': range(1, n+1), 'bidder': [''] * n }) bids = {'alice': 3, 'bob': 3} used_pos = [] for bidder, pos in bids.items(): if pos in used_pos: arrow = output.ix[pos, 'bidder'] output.ix[pos, 'bidder'] = arrow + "\n<- %s" % bidder else: output.ix[pos, 'bidder'] = "<- %s" % bidder print(output) 

  • Umwandlung der String-Darstellung eines Wörterbuchs in ein echtes Wörterbuch
  • Konvertieren eines int zur Liste der einzelnen Digitale schneller?
  • Wie lese ich eine Datei Zeile-für-Zeile in eine Liste?
  • Wie bekomme ich schon in einem String?
  • Einfachste Möglichkeit, Unicode-Darstellungen aus einer Zeichenfolge in Python 3 zu entfernen?
  • Extrahieren von Zahlen aus der Liste der Saiten mit Python
  • Leere XML-Elementbehandlung in Python
  • Unterprozess in Python Variablen hinzufügen
  • One Solution collect form web for “Hübsches Drucken von Zeilen in einem String in einem Pandas DataFrame”

    Von pandas.DataFrame dokumentation :

    Zweidimensionale Größe-veränderliche, potenziell heterogene tabellarische Datenstruktur mit markierten Achsen (Zeilen und Spalten). Arithmetische Operationen richten sich sowohl auf Zeilen- als auch auf Spaltenbeschriftungen aus. Kann man als dict-like Container für Series Objekte denken. Die primäre Pandas-Datenstruktur

    Sie können also keine Zeile ohne Index haben. Newline "\ n" funktioniert nicht in DataFrame.

    Sie können 'pos' mit einem leeren Wert überschreiben und den nächsten 'Bieter' in der nächsten Zeile ausgeben. Aber dann werden Index und 'pos' jedes Mal ausgeglichen, wenn du das machst. Mögen:

      pos bidder 0 1 1 2 2 3 <- alice 3 <- bob 4 5 

    Also, wenn ein Bieter namens 'frank' hatte 4 als Wert, würde es überschreiben 'bob'. Dies würde zu Problemen führen, wenn Sie mehr hinzufügen. Es ist wahrscheinlich möglich, DataFrame zu verwenden und Code zu schreiben, um dieses Problem zu umgehen, aber wahrscheinlich lohnt es, in andere Lösungen zu suchen.

    Hier ist der Code, um die Ausgangsstruktur oben zu erzeugen.

     import pandas as pd n = 5 output = pd.DataFrame({'pos': range(1, n + 1), 'bidder': [''] * n}, columns=['pos', 'bidder']) bids = {'alice': 3, 'bob': 3} used_pos = [] for bidder, pos in bids.items(): if pos in used_pos: output.ix[pos, 'bidder'] = "<- %s" % bidder output.ix[pos, 'pos'] = '' else: output.ix[pos - 1, 'bidder'] = "<- %s" % bidder used_pos.append(pos) print(output) 

    Bearbeiten:

    Eine weitere Möglichkeit besteht darin, die Daten und die Ausgabe neu zu strukturieren. Sie können Pos als Spalten haben und eine neue Zeile für jede Taste / Person in den Daten erstellen. Im Codebeispiel unten druckt das DataFrame mit NaN-Werten durch einen leeren String ersetzt.

     import pandas as pd data = {'johnny\nnewline': 2, 'alice': 3, 'bob': 3, 'frank': 4, 'lisa': 1, 'tom': 8} n = range(1, max(data.values()) + 1) # Create DataFrame with columns = pos output = pd.DataFrame(columns=n, index=[]) # Populate DataFrame with rows for index, (bidder, pos) in enumerate(data.items()): output.loc[index, pos] = bidder # Print the DataFrame and remove NaN to make it easier to read. print(output.fillna('')) # Fetch and print every element in column 2 for index in range(1, 5): print(output.loc[index, 2]) 

    Es hängt davon ab, was du mit den Daten machen willst. Viel Glück 🙂

    Python ist die beste Programmiersprache der Welt.