Я пытаюсь создать loop
или более эффективный процесс, который может count
количество текущих значений в pandas
df
. В данный момент я выбираю значение, для которого я хочу выполнить функцию.
Итак, для df
ниже я пытаюсь определить два counts
.
1) ['u']
возвращает количество тех же оставшихся значений, оставшихся в ['Code', 'Area']
. Итак, сколько оставшихся раз встречаются одинаковые значения.
2) ['On']
возвращает количество значений, которые в настоящее время встречаются в ['Area']
. Это достигается путем анализа df
, чтобы увидеть, не произойдут ли эти значения снова. Так что, по сути, он смотрит в будущее, чтобы увидеть, появятся ли эти значения снова.
import pandas as pd
d = ({
'Code' : ['A','A','A','A','B','A','B','A','A','A'],
'Area' : ['Home','Work','Shops','Park','Cafe','Home','Cafe','Work','Home','Park'],
})
df = pd.DataFrame(data=d)
#Select value
df1 = df[df.Code == 'A'].copy()
df1['u'] = df1[::-1].groupby('Area').Area.cumcount()
ids = [1]
seen = set([df1.iloc[0].Area])
dec = False
for val, u in zip(df1.Area[1:], df1.u[1:]):
ids.append(ids[-1] + (val not in seen) - dec)
seen.add(val)
dec = u == 0
df1['On'] = ids
df1 = df1.reindex(df.index).fillna(df1)
Проблема в том, что я хочу запустить этот скрипт для всех значений в Code
. Вместо того, чтобы выбирать по одному. Например, если я хочу сделать то же самое на Code['B']
, мне придется изменить: df2 = df1[df1.Code == 'B'].copy()
и снова запустить скрипт.
Если у меня есть многочисленные значения в Code
, это становится очень неэффективным. Мне нужно loop
, где он находит все unique
значения в 'Code'
В идеале скрипт должен выглядеть следующим образом:
df1 = df[df.Code == 'All unique values'].copy()
Предполагаемый вывод:
Code Area u On
0 A Home 2.0 1.0
1 A Work 1.0 2.0
2 A Shops 0.0 3.0
3 A Park 1.0 3.0
4 B Cafe 1.0 1.0
5 A Home 1.0 3.0
6 B Cafe 0.0 1.0
7 A Work 0.0 3.0
8 A Home 0.0 2.0
9 A Park 0.0 1.0