Python, что использовать вместо itterrows в этом случае?

Я пытаюсь ускорить свою программу, я новичок в python и pandas, и я просто использовал этот код, чтобы посмотреть, работает ли он, и он работает, однако есть способ ускорить его. Я знаю, что itterrows работает очень медленно и, возможно, функция .apply работает быстрее, но я понятия не имею, как ее использовать, если я хочу использовать в ней текущую позицию строки. Может быть, кто-нибудь из вас сможет мне помочь.

Вот мой код:

for i, row in df.iterrows():
    if df.iloc[i, 2] == 1000:
        list = []
        datum = df.iloc[i, 0]
        id = df.iloc[i, 1]
        for j, row in df.iterrows():
            if df.iloc[j, 0] == datum:
                if df.iloc[j, 0] != id:
                    waarde = df.iloc[j, 2]
                    if waarde != 1000:
                        waarde2 = df.iloc[j-1, 2]
                        respectivelijk = waarde / waarde2
                        # print(waarde)
                        # print(waarde2)
                        # print(respectivelijk)
                        list.append(respectivelijk)
        # print(list)
        gem = sum(list) / len(list)
        # print(gem)
        # print(df.iloc[i-1, 2])
        correcte_waarde = (gem * df.iloc[i-1, 2])
        # print(correcte_waarde)
        df.set_value(i, 'water_level', correcte_waarde)

Мой фрейм данных выглядит так: https://gyazo.com/0fdce9cbac81562195e4f24d55eac9a9 Я использую этот код для замены ошибок (значение 1000) на значение, основанное на изменениях значений других объектов. Например, если все другие объекты вырастут на 50% за недостающий час, я могу предположить / оценить, что недостающее значение также вырастет на 50%.

Вы должны опубликовать отрывок из своего файла (и включить его в вопрос в виде текста) и желаемый преобразованный набор данных. Это не только поможет нам ответить, но и сделает вопрос потенциально полезным для будущих читателей (см. Также минимальный воспроизводимый пример).

user2314737 06.12.2018 00:10

Простите меня, если я неправильно понял ваш код, но если вы просто находите значения, равные 1000, и заменяете их значениями из предыдущей строки, вы можете заменить свои значения == 1000 на NaN и использовать какое-то заполнение для замены NaN (fillna() или interpolate()). Например: df["Value"].replace(1000, np.NaN, inplace=True); df["Value"].interpolate(method = "values", inplace=True)

Plasma 06.12.2018 10:14

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

Dion 06.12.2018 12:00
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
0
3
266
1

Ответы 1

Из вашего объяснения я не могу сказать, чего именно вы хотите достичь. Я предполагаю что

  • 1) вы хотите найти все строки, в которых значение Value (вы должны использовать здесь другое имя ...) - equal to 1000, потому что оно представляет собой ошибку чтения.
  • 2), что затем вы хотите заменить 1000 на что-то более представительное, например, с помощью интерполяции.

Я буду исходить из этих двух предположений. Я использую столбец temp для представления вашего столбца value.

import pandas as pd
import numpy as np
from datetime import datetime, timedelta

# seed for reproducibility
np.random.seed(seed=1111)

# generate a dataframe with random datetimes and values
date_today = datetime.now()
days = pd.date_range(date_today, date_today + timedelta(1000), freq='D')
data = np.random.randint(1, high=100, size=len(days))
df = pd.DataFrame({'the_date': days, 'temp': data})
df = df.set_index('the_date')

print(df)

# get all the indicies of the temp column where the value equals 23. Change it to 1000 for your data.
select_indices = list(np.where(df["temp"] == 23)[0])

# replace all values in the temp column that equal 23 with NAN. Change 23 to 1000 for your data.
df.loc[df['temp'] == 23] = np.nan

# interpolate the data and replace the NAN's
interpolated_df = df.interpolate(method='linear', axis=0).ffill().bfill()

# get the interpolated rows, just to see what values the NAN's were replaced with
interpolated_rows = interpolated_df.iloc[select_indices]

print(interpolated_rows)

Надеюсь, это поможет.

Другие вопросы по теме