Ik heb een panda-dataframe zoals df met een kolom construct_name
construct_name
aaaa_t1_2
cccc_t4_10
bbbb_g3_3
en ga zo maar door. Ik wil eerst alle namen bij het onderstrepingsteken splitsen en het eerste element (aaaa,cccc, etc.) opslaan als een andere kolomnaam.
Verwachte uitvoer
construct_name name
aaaa_t1_2 aaaa
cccc_t4_10 bbbb
en ga zo maar door.
Ik heb het volgende geprobeerd
df['construct_name'].map(lambda row:row.split("_"))
en het geeft me een lijst zoals
[aaaa,t1,2]
[cccc,t4,10]
en ga zo maar door
Maar als ik dat doe
df['construct_name'].map(lambda row:row.split("_"))[0]
om het eerste element van de lijst te krijgen krijg ik een foutmelding. Kunt u een oplossing voorstellen. Bedankt
Antwoord 1, autoriteit 100%
Gebruik gewoon de gevectoriseerde str
methode split
en gebruik integer indexeren op de lijst om het eerste element te krijgen:
In [228]:
df['first'] = df['construct_name'].str.split('_').str[0]
df
Out[228]:
construct_name first
0 aaaa_t1_2 aaaa
1 cccc_t4_10 cccc
2 bbbb_g3_3 bbbb
Antwoord 2, autoriteit 4%
Nadat je de split
hebt gedaan, zou je het eerste element moeten krijgen (met [0]). En niet na de map
.:
In [608]: temp['name'] = temp['construct_name'].map(lambda v: v.split('_')[0])
In [609]: temp
Out[609]:
construct_name name
0 aaaa_t1_2 aaaa
1 cccc_t4_10 cccc
2 bbbb_g3_3 bbbb
Antwoord 3, autoriteit 2%
split
neem een optioneel argument maxsplit
:
>>> construct_name = 'aaaa_t1_2'
>>> name, rest = construct_name.split('_', 1)
>>> name
'aaaa'
Antwoord 4
Een andere manier om de gevectoriseerde str.split
methode te gebruiken is het doorgeven van de expand=True
vlag die vervolgens één kolom retourneert voor elk van de gesplitste delen.
>>> s = pd.Series( ['aaaa_t1_2', 'cccc_t4_10', 'bbbb_g3_3'], name='construct_name')
>>> s.str.split('_', expand=True) # to see what expand=True does
0 1 2
0 aaaa t1 2
1 cccc t4 10
2 bbbb g3 3
>>> s.str.split('_', expand=True)[0] # what you want, select first elements
0 aaaa
1 cccc
2 bbbb
Dit zou vooral handig zijn als u bijvoorbeeld de eerste en tweede waarden wilt behouden.
In termen van het algemene gedrag van de vlag expand=True
: als de invoertekenreeksen niet hetzelfde aantal onderstrepingstekens hebben, kunt u None
s krijgen:
>>> s = pd.Series( ['aaaa_t1_2', 'cccc_t4', 'bbbb_g33'], name='construct_name')
>>> s.str.split('_', expand=True)
0 1 2
0 aaaa t1 2
1 cccc t4 None
2 bbbb g33 None
Antwoord 5
df['name'] = df['construct_name'].str.split('_').str.get(0)
of
df['name'] = df['construct_name'].str.split('_').apply(lambda x: x[0])