2016-11-21 6 views
1

Sagen wir, ich habe einen Datenrahmen wie folgt aus:Pandas: assign kategorische Spalte basierend auf String-Werte in einer anderen Spalte

 A   B 
1 05010001 17 
2 05020001 5 
3 05020002 11 
4 05020003 2 
5 05030001 86 
6 07030001 84 
7 07030002 10 
8 08010001 16 

ich eine dritte Spalte hinzufügen möchten, C, die 1 auf alle Zeilen zuordnet, die A Wert beginnt mit 05, 2 zu allen Werten beginnend mit 07 und so weiter.

wäre das Ergebnis:

 A   B C 
1 05010001 17 1 
2 05020001 5 1 
3 05020002 11 1 
4 05020003 2 1 
5 05030001 86 1 
6 07030001 84 2 
7 07030002 10 2 
8 08010001 16 3 

Was dies zu tun, ist die effizienteste Art und Weise? Mein aktueller Datenrahmen hat 3.000.000 Zeilen.

EDIT

Spalte A in meinem eigentlichen Datenrahmen ist First (C), mit einem Raum. Ich darf das nicht ändern. Muss ich eine Manipulation am Spaltenkopf vornehmen?

Antwort

3
firstTwo = df.sort_values('A').A.str[:2]   # sort the data frame by column A and 
                # take the first two digits of column A 
df['C'] = (firstTwo != firstTwo.shift()).cumsum() # create ids based on the first two 
                # digits with cumsum 
df 

enter image description here

+0

Eine Sache. In meinem tatsächlichen Fall wird die Spalte "A" "First (C)" genannt. Wenn Sie mit Ihrem Snippet spielen, treten beim Aufruf des 'A.str [: 2]' -Teils Probleme auf. Ich nehme 'A.str' bezieht sich auf Spalte' A', aber was, wenn sein Name anders ist, als in meinem Fall? – FaCoffee

+1

Sie können sie in Klammern setzen wie 'df.sort_values ​​('First (C)') ['First (C)']. Str [: 2]' – Psidom

Verwandte Themen