Вычитание значений из строки на основе других столбцов - PullRequest
0 голосов
/ 27 апреля 2018

Извините за смутное название, которое трудно объяснить. Это проще для отображения.

Я пытаюсь вычесть значения из той же строки, но на основе строк в других столбцах. Вот ввод df:

import pandas as pd
import numpy as np

k = 5
N = 8

d = ({'Time' : np.random.randint(k, k + 100 , size=N),
    'Events' : ['ABC','DEF','GHI','JKL','ABC','DEF','GHI','JKL'],
    'Number1' : ['xx','xx',1,'xx','xx','xx',2,'xx'],
    'Number2' : ['xx',1,'xx',1,'xx',2,'xx',2]})

df = pd.DataFrame(data=d)

Выход:

  Events Number1 Number2  Time
0    ABC      xx      xx    14
1    DEF      xx       1    34
2    GHI       1      xx    78
3    JKL      xx       1    49
4    ABC      xx      xx    49
5    DEF      xx       2    24
6    GHI       2      xx    19
7    JKL      xx       2    67

Я хочу экспортировать значения, основанные на разнице в Time. Первый столбец разницы во времени будет ABC - DEF, а второй столбец будет GHI - JKL.

Мне нужно повторить этот процесс несколько раз. В приведенном выше примере цикл отображается 2 раза. Я могу использовать целые числа для столбцов Number1 и Number2, но они не в порядке.

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

for col in ['Number2']:
    df[col] = df[col].ffill() 

Но это создает 5 одинаковых целых чисел, когда мне нужно 4.

Затем я вручную вычел соответствующие значения с помощью среза строки, но это становится очень неэффективным, когда мне приходится делать это много раз.

Можно ли создать цикл, вычитая предполагаемые строки?

Для приведенного выше примера результат будет:

   Diff_1  Diff_2
0     -20      29
1      25     -48

Ответы [ 2 ]

0 голосов
/ 27 апреля 2018
import pandas as pd
import numpy as np

k = 5
N = 8

d = ({'Time' : np.random.randint(k, k + 100 , size=N),
    'Events' : ['ABC','DEF','GHI','JKL','ABC','DEF','GHI','JKL'],
    'Number1' : ['xx','xx',1,'xx','xx','xx',2,'xx'],
    'Number2' : ['xx',1,'xx',1,'xx',2,'xx',2]})

df = pd.DataFrame(data=d)
print(df)

Выход:

      Events Number1 Number2  Time
0    ABC      xx      xx     8
1    DEF      xx       1    54
2    GHI       1      xx    52
3    JKL      xx       1    101
4    ABC      xx      xx    56
5    DEF      xx       2    34
6    GHI       2      xx    81
7    JKL      xx       2    23

Это будет иметь новый col в df. Мы заботимся только о строках для ABC и GHI

df['diff'] = df['Time'] - df['Time'].shift(-1)
diff = pd.DataFrame({
    'diff1' : list(df.loc[df['Events'] == 'ABC', 'diff']),
    'diff2' : list(df.loc[df['Events'] == 'GHI', 'diff'])
})
print(diff)

Выход:

   diff1  diff2
0  -46.0  -49.0
1   22.0   58.0
0 голосов
/ 27 апреля 2018

Вы можете использовать shift, чтобы легко найти разницу для df, который упорядочен подобным образом. Но с этим есть много различий, которые вас не волнуют. Вы хотите 0, 4, 8 ... разницу для первой разницы и 2, 6, 10 ... разницу для второй разницы. Это легко сделать с помощью .iloc

import pandas as pd
diff = (df.Time-df.Time.shift(-1))

pd.DataFrame({'Diff_1': diff.iloc[::4].values,
              'Diff_2': diff.iloc[2::4].values})
#   Diff_1  Diff_2
#0   -20.0    29.0
#1    25.0   -48.0
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...