In Python habe ich die folgende df (Überschriften in der ersten Zeile):

FullName          FirstName
'MichaelJordan'   'Michael'
'KobeBryant'      'Kobe'
'LeBronJames'     'LeBron'  

Ich versuche, jeden Datensatz in "FullName" basierend auf dem Wert in "FirstName" aufzuteilen, habe aber kein Glück ...

Das habe ich versucht:

df['Names'] = df['FullName'].str.split(df['FirstName'])

Was zu Fehlern führt:

'Series' objects are mutable, thus they cannot be hashed

Gewünschte Ausgabe:

print(df['Names'])

['Michael', 'Jordan']
['Kobe', 'Bryant']
['LeBron', 'James']
2
Andrew Vitek 21 Feb. 2020 im 23:31

4 Antworten

Beste Antwort

str.replace

lastnames = [full.replace(first, '') for full, first in zip(df.FullName, df.FirstName)]
df.assign(LastName=lastnames)

        FullName FirstName LastName
0  MichaelJordan   Michael   Jordan
1     KobeBryant      Kobe   Bryant
2    LeBronJames    LeBron    James

Gleiche genaue Idee, aber mit map

df.assign(LastName=[*map(lambda a, b: a.replace(b, ''), df.FullName, df.FirstName)])

        FullName FirstName LastName
0  MichaelJordan   Michael   Jordan
1     KobeBryant      Kobe   Bryant
2    LeBronJames    LeBron    James
5
piRSquared 21 Feb. 2020 im 20:47

Da Sie zeilenweise Operationen ausführen, können wir anwenden,

Die Idee ist, den Vornamen durch sich selbst + ein Komma zu ersetzen, um ihn zu teilen

df["SplitName"] = df.apply(
    lambda x: x["FullName"].replace(x["FirstName"], f"{x['FirstName']}, "), axis=1
)


print(df['SplitName'].str.split(',',expand=True))

         0        1
0  Michael   Jordan
1     Kobe   Bryant
2   LeBron    James
3
Datanovice 21 Feb. 2020 im 20:41

Dies ist ein Oneliner mit einer Anwendung. Teilen Sie das FullName auf die Länge des FirstName:

df['Names'] = df.apply(lambda row: [row['FullName'][:len(row['FirstName'])], row['FullName'][len(row['FirstName']):]] if row['FullName'].startswith(row['FirstName']) else '', axis=1)
        FullName FirstName              Names
0  MichaelJordan   Michael  [Michael, Jordan]
1     KobeBryant      Kobe     [Kobe, Bryant]
2    LeBronJames    LeBron    [LeBron, James]


0
Dave 21 Feb. 2020 im 20:46
>>> df.assign(names=[[firstname, fullname[len(firstname):]] 
                     for fullname, firstname in df[['FullName', 'FirstName']].values])
        FullName FirstName              names
0  MichaelJordan   Michael  [Michael, Jordan]
1     KobeBryant      Kobe     [Kobe, Bryant]
2    LeBronJames    LeBron    [LeBron, James]
3
Alexander 21 Feb. 2020 im 20:50