Панды новичок — Чтение excel — попытка применить формулу к столбцам

#python #excel #pandas

Вопрос:

У меня есть лист Excel с несколькими столбцами, три из которых называются X Y Z. Я пытаюсь применить ту же формулу к трем столбцам, используя фрейм данных panda. Мне нужно вычесть последнее значение в столбце из каждого значения ячейки в этом столбце; сохраните новое значение и продолжайте двигаться вниз по столбцу. Есть ли способ сделать это без повторения каждой строки? Этот процесс должен выполняться только для каждого из столбцов X Y и Z.

 INPUT
T   X    Y   Z   vx   vy   vz
0   0     0   3   3     4     5
1   0     1   4   4     4     6
2   23    6   9   5     6     6
3   35    9   9   7     7     8
 
 Output
T    X     Y    Z   vx   vy   vz
0   -35   -9  -6    3     4     5
1   -35   -8  -5    4     4     6
2   -12   -3   0    5     6     6
3     0    0    0   7     7     8
 

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

1. Можете ли вы обеспечить ввод и вывод? Это облегчит понимание вашей проблемы.

Ответ №1:

Очевидно, не каждый из столбцов, так как вы применяете его только к столбцам X, Y и Z.

в любом случае,

выбор входного столбца, а затем вычитание последней записи в нем, похоже, то, что вы ищете.

 df = pd.read_clipboard()
df[["X","Y","Z"]] = df[["X", "Y", "Z"]] - df[["X", "Y", "Z"]].iloc[-1]
 

выход:

 #   T   X  Y  Z  vx  vy  vz
#0  0 -35 -9 -6   3   4   5
#1  1 -35 -8 -5   4   4   6
#2  2 -12 -3  0   5   6   6
#3  3   0  0  0   7   7   8
 

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

1. Есть ли способ использовать индекс столбца вместо имени. Некоторые листы в книге имеют небольшое изменение в заголовке, как в «x_n» вместо «x».

2. Ага. вы также можете получить доступ к столбцам с помощью целочисленной индексации местоположения. df.iloc[:, 1:4] -= df.iloc[-1, 1:4] это была бы моя первоначальная ставка на приведенный выше фрагмент.

Ответ №2:

Предполагая, что вы хотите сделать все столбцы, это будет работать с электронной таблицей под названием «file.xls»:

 import pandas as pd 
df = pd.read_excel('file.xls', header=None)

for i in df.columns:
    df[i] = df[i] - int(df[i].tail(1))

print (df)