2017-06-23 6 views
2

Ich habe folgende df:Wie erstellt man eine neue Pandas-Spalte basierend auf einer anderen Spalte eines Datenrahmens?

id1  id2  id3(expected_col) 
    21  4   21a 
    21  4   21a 
    21  4   21a 
    21  5   21b 
    22  6   22a 
    22  6   22a 
    22  6   22a 
    23  7   23a 
    23  7   23a 
    23  8   23b 
    23  9   23c 

Es gibt zwei columns- id1 und id2, möchte ich eine neue Spalte produzieren ıd3 welche Art von Kombination der beiden vorherigen Spalten erstellen.

Der ganzzahlige Teil ist gleich der id1 Spalte, aber ich möchte Zeichenfolge hinzuzufügen, die, wenn id2 Änderungen ändert, und dann wird der alphabetischen Zyklus beginnt wieder mit „a“, wenn neue id1 angetroffen wird.

Also vielleicht können wir grouby ID1 und dann Rest der Operation durchführen, aber ich bin mir nicht sicher, wie die Zeichenfolge Alphabete für die neue Spalte zu generieren. Im obigen df id3 ist die resultierende Spalte I erwartet.

Bitte lassen Sie mich wissen, wenn etwas unklar ist.

Antwort

1

Mit einem GroupBy-Apply-Ansatz, mit shift, ne und cumsum auf Gruppenebene auf ‚ID2‘ verwendet, um Veränderungen zu bestimmen, dann gegen die Abbildung ascii_lowercase Buchstaben.

from string import ascii_lowercase 

def combine_ids(grp, letters): 
    grp = grp.ne(grp.shift()).cumsum() - 1 
    return str(grp.name) + grp.map(letters) 

letters = pd.Series(list(ascii_lowercase)) 
df['id3'] = df.groupby('id1')['id2'].apply(combine_ids, letters) 

Das obige geht davon aus, dass Sie nur bis zu 26 Buchstaben zum Anhängen benötigen. Wenn Sie mehr benötigen, könnten Sie ein ähnliches Verfahren wie unten verwenden, um wiederholte Buchstaben ‚aa‘ hinzufügen - ‚zz‘:

from itertools import product 
from string import ascii_lowercase 

doubles = map(''.join, product(ascii_lowercase, repeat=2)) 
letters = pd.Series(list(ascii_lowercase) + list(doubles)) 

Die resultierende Ausgabe:

id1 id2 id3 
0 21 4 21a 
1 21 4 21a 
2 21 4 21a 
3 21 5 21b 
4 22 6 22a 
5 22 6 22a 
6 22 6 22a 
7 23 7 23a 
8 23 7 23a 
9 23 8 23b 
10 23 9 23c 
+0

Vielen Dank, das ist perfekt ! – Liza

Verwandte Themen