#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. Но вы ожидаете исключения, верно? Просто с другим сообщением об ошибке?