Pandas означает, что функция возвращает все NaN - PullRequest
1 голос
/ 30 марта 2020

У меня есть этот фрейм данных:

df = [{'A1':10, 'A2':''}, {'A1':11,'A2':110}, {'A1':12,'A2':120}]

И я бы хотел усреднить различные столбцы, игнорируя значения '' (пустая строка).

Это желаемый вывод

df_AVG = [{'A1':10, 'A2':'','avg':10}, {'A1':11,'A2':110,'avg': 60.5}, {'A1':12,'A2':120,'avg':66}]

И я могу сделать это с помощью этого кода:

df['avg'] = df[['A1','A2']].mean(axis=1, numeric_only=True)

Но когда я изменяю фрейм данных, он включает более одного пробела, как этот

df = [{'A1':10, 'A2':''}, {'A1':'','A2':110}, {'A1':12,'A2':120}]

И я запускаю тот же код, вывод такой. Все значения 'avg' являются NaN, включая те, которые ранее работали:

df_AVG = [{'A1':10, 'A2':'','avg':NaN}, {'A1':11,'A2':110,'avg': NaN}, {'A1':12,'A2':120,'avg':NaN}]

Не могли бы вы сказать мне, что не так с этим подходом? Спасибо!

Ответы [ 2 ]

2 голосов
/ 30 марта 2020

Вы должны привести столбцы к числовым c типам. Простой способ может быть:

df['avg'] = pd.DataFrame({col : pd.to_numeric(df[col]) for col in df.columns}).mean(axis=1)

Это дает, как и ожидалось:

   A1   A2    avg
0  10        10.0
1      110  110.0
2  12  120   66.0
2 голосов
/ 30 марта 2020

Когда вы используете numeric_only, он «отбрасывает» не числовые столбцы, поэтому во втором случае он удаляет все столбцы, поскольку они оба являются строками. Если вы проверите более внимательно свое среднее значение в первом случае, вы увидите, что во втором и третьем ряду он занимает только 11 и 12, поскольку 110 и 120 «отброшены» из-за пустой строки.

Если вы хотите, вы можете сделать это:

df['avg'] = df[['A1','A2']].replace('', np.nan).apply(lambda row: np.nanmean(row), axis=1)

Заменить '' на NaN и получить среднее значение, игнорируя эти NaN

...