Ошибка типа: arg должен быть списком, кортежем, 1-d массивом или серией

#python #pandas #aggregate

Вопрос:

Дано:

 import pandas as pd import numpy as np df = pd.DataFrame(  columns=" index who msg num ".split(),  data= [  [ 1, "U1", "ALRM", 2, ],  [ 2, "U1", "ALRM", 5, ],  [ 3, "U3", "ALRM", 6, ],  [ 4, "U3", "ALRM", 2, ],  [ 5, "U3", "INFO", 3, ],]).set_index("index", drop=True)  gp = df.groupby('who')  

Следующий код создаст исключение, как показано в заголовке:

 gp.agg(lambda x: pd.to_numeric(x, errors='coerce'))  gt;gt;gt; ~Anaconda3libsite-packagespandascoretoolsnumeric.py in to_numeric(arg, errors, downcast)  139 values = np.array([arg], dtype="O")  140 elif getattr(arg, "ndim", 1) gt; 1: --gt; 141 raise TypeError("arg must be a list, tuple, 1-d array, or Series")  142 else:  143 values = arg  TypeError: arg must be a list, tuple, 1-d array, or Series  

вопрос:
вопрос НЕ в том, «как это исправить», следующее исправит это:

 gp.agg(lambda x: list(pd.to_numeric(x, errors='coerce')) ) or gp.agg(lambda x: pd.to_numeric(x, errors='coerce').sum() ) or any operation that reduces "x" in lambda into a NONE-sr or NONE-df  

Вопрос заключается во внутренней работе того, как .agg() это выполняется, потому что я не вижу, как исключение может быть сгенерировано логикой в тексте исключения:

 140 elif getattr(arg, "ndim", 1) gt; 1: # lt;=========== This logic here  141 raise TypeError("arg must be a list, tuple, 1-d array, or Series")  

В частности, ни при каких обстоятельствах, x по lambda выражению, бытие to_numeric() , на которое обращают внимание, не имеет многомерности. Я пришел к выводу в предыдущем предложении, запустив это:

 gp.agg(lambda x: print('n-----a new x------n', x, sep=''))  gt;gt;gt;  -----a new x------ 1 ALRM 2 ALRM Name: msg, dtype: object  -----a new x------ 3 ALRM 4 ALRM 5 INFO Name: msg, dtype: object  -----a new x------ 1 2 2 5 Name: num, dtype: int64  -----a new x------ 3 6 4 2 5 3 Name: num, dtype: int64  

что показывает, что в систему подается только один 1-D series за раз to_numeric() . Я более или менее ожидаю, что исключение будет чем-то вроде can't assign a series back into a cell of a df

Комментарии:

1. Исключение, которое я получаю , намного длиннее , чем у вас, и показывает ValueError: no results , за которым следует During handling of the above exception, another exception occurred: , за которым следует более длинный stracktrace, завершающийся вашим сообщением об ошибке. Исходное исключение также происходит из pandas/core/base.py in _aggregate_multiple_funcs(self, arg, _axis) , что намного ближе к .agg использованию, чем сообщение об ошибке, которое вы показываете здесь.

2. Логика вашего сообщения об ошибке, конечно, заключается в том, что весь столбец «msg» не является числовым, поэтому преобразование не выполняется для всего этого столбца/ряда. errors="coerce" (Или errors="ignore" ) там не поможет.

3. Более того, ваша функция преобразования не является агрегатной функцией, поэтому я не уверен, какова ваша цель.

4. @9769953 errors="coerce" превратит none-числа в np.nan, я не думаю, что проблема здесь в этом. Я свой пост, «следующее исправит это», как видите, to_numeric работаю довольно хорошо. Пример является очень сжатым простым примером, нет цели заставить этот простой пример работать. Цель состоит в том, чтобы попытаться понять, как именно работает .agg (), или что-то, чего мне здесь не хватает.

5. Но вы ожидаете исключения, верно? Просто с другим сообщением об ошибке?