Ich möchte eine Zeichenfolge an den Anfang jedes Werts in einer der Spalten eines Pandas-Datenrahmens anhängen (elegant). Ich habe bereits herausgefunden, wie das geht und verwende derzeit:
df.ix[(df['col'] != False), 'col'] = 'str'+df[(df['col'] != False), 'col']
Dies scheint eine verdammt unelegante Sache zu sein - kennen Sie einen anderen Weg (der den Charakter vielleicht auch zu Zeilen hinzufügt, in denen diese Spalte 0 oder NaN ist)?
Falls dies noch unklar ist, möchte ich mich wenden:
col
1 a
2 0
in:
col
1 stra
2 str0
!= False
los mit dem Geschäft? Möchten Siestr
jeden Wert oder nur einige hinzufügen ?df['col'] = 'str' + df['col'].astype(str)
?Antworten:
Beispiel:
quelle
Alternativ können Sie auch eine
apply
Kombination mitformat
(oder besser mit F-Strings) verwenden, die ich etwas besser lesbar finde, wenn man zB auch ein Suffix hinzufügen oder das Element selbst manipulieren möchte:was auch die gewünschte Ausgabe ergibt:
Wenn Sie Python 3.6+ verwenden, können Sie auch F-Strings verwenden:
die gleiche Ausgabe ergeben.
Die F-String-Version ist fast so schnell wie die Lösung von @ RomanPekar (Python 3.6.4):
Die Verwendung
format
ist jedoch in der Tat viel langsamer:quelle
format
in der Tat schlechter abschneidet. Wie hast du verglichen?.apply
ist es immer entweder so schnell oder langsamer als "direkte" vektorisierte Operationen; Auch wenn sie nicht langsamer sind, ziehe ich es vor, sie nach Möglichkeit zu meiden.x
selbst mache usw., aber das ist nur eine Frage des Geschmacks ... :)Sie können pandas.Series.map verwenden:
Es wird das Wort "str" vor allen Ihren Werten anwenden.
quelle
Wenn Sie Ihre Tabellendatei mit einem
dtype=str
Spaltentyp laden oder in einen String konvertieren, können Sie folgende
df['a'] = df['a'].astype(str)
Vorgehensweise verwenden:
Dieser Ansatz ermöglicht das Voranstellen, Anhängen und Teilmengenzeichenfolgen von
df
.Funktioniert mit Pandas v0.23.4, v0.24.1. Ich weiß nichts über frühere Versionen.
quelle
Eine andere Lösung mit .loc:
Dies ist nicht so schnell wie die oben genannten Lösungen (> 1 ms pro Schleife langsamer), kann jedoch nützlich sein, wenn Sie eine bedingte Änderung benötigen, wie z.
quelle
.index
indf[mask].index
?df.loc[mask]
funktioniert und es funktioniert, dann.index
ist das überflüssig, oder?