DataFrame.apply с str.extract выдает ошибку, даже если функция работает на каждой серии столбцов - PullRequest
2 голосов
/ 11 ноября 2019

В этом примере DataFrame: df = pd.DataFrame([['A-3', 'B-4'], ['C-box', 'D1-go']])

Вызов извлечения для отдельных столбцов, когда серии работают нормально:

df.iloc[:, 0].str.extract('-(.+)')
df.iloc[:, 1].str.extract('-(.+)')

, а также для другой оси:

df.iloc[0, :].str.extract('-(.+)')
df.iloc[1, :].str.extract('-(.+)')

Итак, я ожидаю, что применение apply будет работать (путем применения извлечения к каждому столбцу):

df.apply(lambda s: s.str.extract('-(.+)'), axis=0)

Но выдает эту ошибку:

Traceback (most recent call last):
  File "C:\ProgramData\Miniconda3\envs\py3\lib\site-packages\IPython\core\interactiveshell.py", line 3325, in run_code
    exec(code_obj, self.user_global_ns, self.user_ns)
  File "<ipython-input-588-70b1808d5457>", line 2, in <module>
    df.apply(lambda s: s.str.extract('-(.+)'))
  File "C:\ProgramData\Miniconda3\envs\py3\lib\site-packages\pandas\core\frame.py", line 6487, in apply
    return op.get_result()
  File "C:\ProgramData\Miniconda3\envs\py3\lib\site-packages\pandas\core\apply.py", line 151, in get_result
    return self.apply_standard()
  File "C:\ProgramData\Miniconda3\envs\py3\lib\site-packages\pandas\core\apply.py", line 260, in apply_standard
    return self.wrap_results()
  File "C:\ProgramData\Miniconda3\envs\py3\lib\site-packages\pandas\core\apply.py", line 308, in wrap_results
    return self.wrap_results_for_axis()
  File "C:\ProgramData\Miniconda3\envs\py3\lib\site-packages\pandas\core\apply.py", line 340, in wrap_results_for_axis
    result = self.obj._constructor(data=results)
  File "C:\ProgramData\Miniconda3\envs\py3\lib\site-packages\pandas\core\frame.py", line 392, in __init__
    mgr = init_dict(data, index, columns, dtype=dtype)
  File "C:\ProgramData\Miniconda3\envs\py3\lib\site-packages\pandas\core\internals\construction.py", line 212, in init_dict
    return arrays_to_mgr(arrays, data_names, index, columns, dtype=dtype)
  File "C:\ProgramData\Miniconda3\envs\py3\lib\site-packages\pandas\core\internals\construction.py", line 51, in arrays_to_mgr
    index = extract_index(arrays)
  File "C:\ProgramData\Miniconda3\envs\py3\lib\site-packages\pandas\core\internals\construction.py", line 308, in extract_index
    raise ValueError('If using all scalar values, you must pass'
ValueError: If using all scalar values, you must pass an index

Использование axis=1 дает неожиданный результат, Серия с каждой строкой является Серия:

Out[2]: 
0             0
0  3
1  4
1         0
0  box
1   go
dtype: object

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

Ответы [ 2 ]

3 голосов
/ 11 ноября 2019

Вместо этого вы можете использовать split .

df.apply(lambda s: s.str.split('-', expand=True)[1])

Out[1]: 
     0   1
0    3   4
1  box  go
2 голосов
/ 11 ноября 2019

Параметр по умолчанию для раскрытия в str.extract - True, и он возвращает Dataframe. Поскольку вы применяете его к нескольким столбцам, он пытается вернуть несколько фреймов данных. Установите расширение на False, чтобы справиться с этим,

df.apply(lambda x: x.str.extract('-(.*)', expand = False))

    0   1
0   3   4
1   box go
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...