#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])
(или отладчик), вы бы это увидели.