splitsen bij onderstrepingsteken in python en de eerste waarde opslaan

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 strmethode spliten 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 splithebt 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%

splitneem 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.splitmethode te gebruiken is het doorgeven van de expand=Truevlag 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 Nones 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])

Other episodes