репликация данных в том же фрейме данных

#python #pandas

#python #панды

Вопрос:

Я хочу реплицировать данные из одного и того же фрейма данных при выполнении определенного условия. Фрейм данных:

 Hour,Wage
 1,15
 2,17
 4,20
 10,25 
 15,26
 16,30
 17,40
 19,15
 

Я хочу реплицировать фрейм данных при прохождении цикла, и есть разница, превышающая 4 в строке.час.

Ожидаемый результат:

 Hour,Wage
    1,15
    2,17
    4,20
    10,25
    15,26
    16,30
    17,40
    19,15
    2,17
    4,20
 

я хочу повторить строки, когда выполняется итерация по всей строке, и есть разница, превышающая 4 в строке.час
строка.час [0] = 1
строка.час [1] = 2. здесь разница между 1, но в (row.hour[2] = 4 и строка, час [3] = 10). здесь разница равна 6, что больше 4. Я хочу воспроизвести приведенные выше данные индекса, где выполняется это условие (больше 4)
Я могу реплицировать данные с **df = pd.concat([df]*2, ignore_index=False)** помощью .но они не реплицируются, когда я запускаю их с помощью оператора if

Я попробовал приведенный ниже код, но ничего не происходит.

 **for i in range(0,len(df)-1):
     if (df.iloc[i,0] - df.iloc[i 1,0]) > 4  :
            df = pd.concat([df]*2, ignore_index=False)**
 

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

1. Пожалуйста, добавьте дополнительные пояснения.

2. Не очень понятно, что вы хотите сделать.

3. в вашем примере нет разницы в 4 в часовом столбце, также почему внезапно 5 часов становится 10? пожалуйста, объясните немного подробнее, так как непонятно, о чем вы спрашиваете

4. может быть, сначала используйте print() , чтобы увидеть значения в переменных и какая часть кода исключена, может быть, это не заменяет, потому что значение -6 вместо ожидаемого 6 — в df.iloc[i,0] - df.iloc[i 1,0] вас вычисляется 4-10 вместо 10-4 — Если вы будете использовать print( df.iloc[i,0] - df.iloc[i 1,0]) (или использовать debuger), тогда вы увидите это.

Ответ №1:

Насколько я понимаю: вы хотите сравнить значения ‘Hour’ для двух последовательных строк. Если разница> 4, вы хотите добавить предыдущую строку в DF. Если это то, что вы хотите, попробуйте это:

Создайте DF:

        j = pd.DataFrame({'Hour':[1, 2, 4,10,15,16,17,19],
              'Wage':[15,17,20,25,26,30,40,15]})
 

Определите функцию:

    def f1(d):
     dn = d.copy()
     for x in range(len(d)-2):
         if (abs(d.iloc[x 1].Hour - d.iloc[x 2].Hour) > 4):
            idx = x   0.5
            dn.loc[idx] = d.iloc[x]['Hour'], d.iloc[x]['Wage']

     dn = dn.sort_index().reset_index(drop=True)
     return dn
 

Вызовите функцию, передающую ваш DF:

    nd = f1(j)


     Hour   Wage
    0   1   15
   1    2   17
   2    2   17
   3    4   20
   4    4   20
   5    10  25
   6    15  26
   7    16  30
   8    17  40
   9    19  15
 

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

1. Спасибо, это именно то, что я хотел.

2. Могу ли я случайно скопировать данные в том месте, где есть разница, а не в конце

3. Я добавил новую функцию для удовлетворения вашего запроса на вставку inplace. пожалуйста, попробуйте новую функцию..

4. Вы пробовали модифицированную функцию, которую я опубликовал для вашего нового запроса?

5. да, это работает, но не могли бы вы, пожалуйста, объяснить, что вы там сделали я понял предыдущий код, но на этот раз я не могу понять рабочий процесс

Ответ №2:

В очереди

 if df.iloc[i,0] - df.iloc[i 1,0] > 4
 

вы вычисляете 4-10 вместо 10-4 , поэтому вы проверяете -6 > 4 вместо 6 > 4

Вы должны заменить элементы

 if df.iloc[i 1,0] - df.iloc[i,0] > 4
 

или используйте abs() , если вы хотите реплицировать в обеих ситуациях — > 4 и < -4

 if abs(df.iloc[i 1,0] - df.iloc[i,0]) > 4
 

Если бы вы использовали print( df.iloc[i,0] - df.iloc[i 1,0]) (или отладчик), вы бы это увидели.