Pandas, используя numpy .where () извлечение с регулярным выражением, бросает ValueError - PullRequest
1 голос
/ 29 января 2020

Может кто-нибудь объяснить, что я здесь не так делаю? Я пытаюсь использовать np.where () следующим образом:

#IF SLO contains _ use a regular expression to capture the digit after _Gen, ELSE strip off the last character 
df_joined['new'] = np.where(df_joined['SLO'].str.contains('_'), df_joined['SLO'].str.extract(r'_Gen(\d+)_'), df_joined['SLO'].str.strip().str[-1])

Я получаю эту ошибку:

ValueError: Wrong number of items passed 9, placement implies 1

Данные в df_joined ['SLO']:

1997    MIGP8G5
1998    MIGP8G5
1999    MIGP8G5
2000    MIGP8G5
2001    MIGP8G5
2002    MIGP8G5
2003    MIGP8G5
2004    MIGP8G5
2005    MIGP8G5

9 строк

Когда я переставляю код на этот код:

np.where(df_joined['SLO'].str.contains('_'), 
         'test', 
         df_joined['SLO'].str.strip().str[-1])

Он работает правильно и возвращается 9 элементов.

Но когда я делаю this:

np.where(df_joined['SLO'].str.contains('_'), 
         df_joined['SLO'].str.extract(r'_Gen(\d+)_'), 
         df_joined['SLO'].str.strip().str[-1])

81 возвращаются значения

Что я делаю не так?

1 Ответ

2 голосов
/ 29 января 2020

Я думаю, вам нужно expand=False, чтобы избежать одного столбца DataFrame (тогда numpy хотите использовать трансляцию), вам нужно Series:

print (df_joined)
           SLO
1997  _Gen45_a
1998   MIGP8G5
1999   MIGP8G5

df_joined['new'] = np.where(df_joined['SLO'].str.contains('_'), 
                            df_joined['SLO'].str.extract(r'_Gen(\d+)_'), 
                            df_joined['SLO'].str.strip().str[-1])

ValueError: Неверное количество пропущенных элементов 3, размещение подразумевает 1


df_joined['new'] = np.where(df_joined['SLO'].str.contains('_'), 
                            df_joined['SLO'].str.extract(r'_Gen(\d+)_', expand=False), 
                            df_joined['SLO'].str.strip().str[-1])
print (df_joined)

Или выберите столбец 0 для Series:

df_joined['new'] = np.where(df_joined['SLO'].str.contains('_'), 
                            df_joined['SLO'].str.extract(r'_Gen(\d+)_')[0], 
                            df_joined['SLO'].str.strip().str[-1])
print (df_joined)

           SLO new
1997  _Gen45_a  45
1998   MIGP8G5   5
1999   MIGP8G5   5

Подробности :

print (df_joined['SLO'].str.extract(r'_Gen(\d+)_'))
        0
1997   45
1998  NaN
1999  NaN

print (df_joined['SLO'].str.extract(r'_Gen(\d+)_', expand=False))
1997     45
1998    NaN
1999    NaN
Name: SLO, dtype: object
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...