У меня есть фрейм данных с отсортированными значениями, помеченными идентификаторами, и я хочу взять разницу значения для первого элемента идентификатора со значением последних элементов всех предыдущих идентификаторов.Код ниже делает то, что я хочу:
import pandas as pd
a = 'a'; b = 'b'; c = 'c'
df = pd.DataFrame(data=[*zip([a, a, a, b, b, c, a], [1, 2, 3, 5, 6, 7, 8])],
columns=['id', 'value'])
print(df)
# # take the last value for a particular id
# last_value_for_id = df.loc[df.id.shift(-1) != df.id, :]
# print(last_value_for_id)
current_id = ''; prev_values = {};diffs = {}
for t in df.itertuples(index=False):
prev_values[t.id] = t.value
if current_id != t.id:
current_id = t.id
else: continue
for k, v in prev_values.items():
if k == current_id: continue
diffs[(k, current_id)] = t.value - v
print(pd.DataFrame(data=diffs.values(), columns=['diff'], index=diffs.keys()))
печатает:
id value
0 a 1
1 a 2
2 a 3
3 b 5
4 b 6
5 c 7
6 a 8
diff
a b 2
c 4
b c 1
a 2
c a 1
Однако я хочу сделать это в векторизации.Я нашел способ получить последовательность последних элементов, как в:
# take the last value for a particular id
last_value_for_id = df.loc[df.id.shift(-1) != df.id, :]
print(last_value_for_id)
, что дает мне:
id value
2 a 3
4 b 6
5 c 7
, но не могу найти способ использовать это, чтобы взятьотличается в векторизации