Как я могу вернуть первый элемент разбиения в лямбду в Python? - PullRequest
1 голос
/ 11 апреля 2019

, поэтому мне нужно разделить столбец фрейма данных и получить первый элемент для добавления в новый столбец с лямбда-выражением. Я не могу понять, как это сделать.

df['Reason'] = df['title'].apply(lambda x: x.split(':'))

Я сейчас получаю это:

df['Reason'].head()

0     [EMS,  BACK PAINS/INJURY]
1    [EMS,  DIABETIC EMERGENCY]
2        [Fire,  GAS-ODOR/LEAK]
3     [EMS,  CARDIAC EMERGENCY]
4             [EMS,  DIZZINESS]

и я бы хотел:

df['Reason'].head()

0     [EMS]
1     [EMS]
2     [Fire]
3     [EMS]
4     [EMS]

Ответы [ 4 ]

2 голосов
/ 11 апреля 2019

Я использую str.findall с regex здесь

df.text.str.findall(r"^\w+").str[0]
0     abc
1     foo
2    test
3     NaN
Name: text, dtype: object
1 голос
/ 11 апреля 2019

Если у вас есть столбец, заполненный lists, просто сделайте просто

df['Readon'].str[0]

или

df['Readon'].str.get(0)

Выходы

0     [EMS]
1     [EMS]
2     [Fire]
3     [EMS]
4     [EMS]
1 голос
/ 11 апреля 2019
df = pd.DataFrame({'text': ['abc xyz', 'foo bar', 'test', np.nan]})
df

      text
0  abc xyz
1  foo bar
2     test
3      NaN

Используйте любой str метод.Например, str.split:

df['text'].str.split(n=1).str[0]

0     abc
1     foo
2    test
3     NaN
Name: text, dtype: object

или str.partition:

df['text'].str.partition(' ')[0]

0     abc
1     foo
2    test
3     NaN
Name: text, dtype: object

Приведенные выше методы упрощают работу с NaN.apply потерпит неудачу здесь:

df['text'].apply(lambda x: x.split(':')[0])
# ---------------------------------------------------------------------------
# AttributeError                            Traceback (most recent call last)
# AttributeError: 'float' object has no attribute 'split'

Проверка isinstance является исправлением для этого,

df['text'].apply(lambda x: x.split(None, 1)[0] if isinstance(x, str) else np.nan)

0     abc
1     foo
2    test
3     NaN
Name: text, dtype: object
0 голосов
/ 11 апреля 2019

Возьмите первый элемент списка, возвращаемый split():

df['Reason'] = df['title'].apply(lambda x: x.split(':')[0])

. Для дополнительного кредита, скажите split(), что нужно разделить только один раз, чтобы не мешало разделять больше элементов только для броска.их прочь.

df['Reason'] = df['title'].apply(lambda x: x.split(':', 1)[0])

Или используйте partition() вместо:

df['Reason'] = df['title'].apply(lambda x: x.partition(':')[0])
...