Я хочу преобразовать все строки фрейма данных в массивы и использовать массивы в функции. Функция должна создать новый столбец с результатами функции для каждой строки.
def harmonicMean(arr):
sum = 0;
for item in arr:
sum = sum + float(1.0/item);
print "inside" + str(float(1.0/item));
print sum;
return float(len(arr) / sum);
Функция фактически генерирует среднее гармоническое для каждой строки во фрейме данных. Эти значения должны быть заполнены в новом столбце во фрейме данных. (фрейм данных также содержит значения Nan
)
вы можете использовать встроенные методы .iloc
и .to_list()
, чтобы получить строки в виде массива и передать их вашему методу.
rows = df.shape[0]
for i in range(rows):
row_lst = df.iloc[i].to_list()
print(harmonicMean(row_lst))
df.values даст numpy ndarray.. это может повторяться по строке.. таким образом быстрее..
@nickthefreak спасибо! это сработало. Однако я получаю эту ошибку: ZeroDivisionError: («деление с плавающей запятой на ноль», «произошло с индексом 0»), поскольку строки также содержат нули. Любая идея, как игнорировать нулевые значения и значения Nan при вычислении среднего гармонического значения?
Я не могу сказать, возникает ли ошибка деления на ноль при делении на элемент или при делении на сумму; вероятно, может произойти для любого из подразделений. Вероятно, вам нужно добавить оператор if, проверяющий, что элемент и сумма больше 0 перед делением
я пробовал это, я получаю эту ошибку: row_lst = data1.iloc[i].to_list() File "C:\Users\Pinky\AppData\Local\Programs\Python\Python37-32\lib\site- пакеты\pandas\core\generic.py", строка 4376, в возвращаемом объекте getattr.__getattribute__(self, name) AttributeError: объект "Series" не имеет атрибута "to_list"
Вы можете рассчитать, не перебирая строки:
df['hmean'] = df.notnull().sum(axis=1)/(1/df).sum(axis=1)
a b c d e hmean
0 4 5.0 2.0 5.0 10 4.000000
1 2 8.0 1.0 8.0 6 2.608696
2 7 NaN 1.0 1.0 8 1.763780
3 7 1.0 9.0 4.0 9 3.095823
4 8 5.0 8.0 NaN 3 5.106383
5 3 8.0 6.0 10.0 6 5.607477
6 3 7.0 3.0 9.0 9 4.846154
7 8 NaN NaN NaN 6 6.857143
8 2 4.0 1.0 5.0 2 2.040816
9 5 7.0 5.0 3.0 1 2.664975
Привет! спасибо за ответ, я получаю 1 ошибку, которую я не понимаю. Пишет: Не удалось оперировать 1 со значениями блока с плавающим делением на ноль. Вы знаете, что это значит?
@JagruthiC Я не совсем уверен. Это может быть проблема деления на 0, хотя я не могу воспроизвести эту проблему на своем конце, так как это, похоже, обрабатывает все строки NaN и 0/NaN или #/0 на моем конце.
Можете ли вы предоставить больше информации? как образец данных (может быть
df.head()
), что вы пробовали и что вы хотите получить