Со второй попытки это работает.
Было довольно сложно понять вопрос.
Я был уверен, что это должно быть сделано с пандами
groupby () и объединение данных, если вы проверите
Из истории этого ответа вы можете увидеть, как я
изменил ответ, чтобы заменить более медленный Python
код с быстрым кодом Панд.
Код ниже сначала подсчитывает уникальные значения
местоположение, а затем использует вспомогательный фрейм данных для
создать окончательное значение.
Я рекомендую вставить этот код в блокнот Jupyter.
и изучить промежуточные шаги.
import pandas as pd
import numpy as np
d = ({
'Day' : ['Mon','Tues','Wed','Wed','Thurs','Thurs','Fri','Mon','Sat','Fri','Sun'],
'Location' : ['Home','Home','Away','Home','Away','Home','Home','Home','Home','Away','Home'],
})
df = pd.DataFrame(data=d)
# including the example result
df["example"] = pd.Series(["C" + str(e) for e in [1, 1, 2, 1, 2, 3, 3, 1, 3, 2, 4]])
# this groups days per location
s_grouped = df.groupby(["Location"])["Day"].unique()
# This is the 3 unique indicator per location
df["Pre-Assign"] = df.apply(
lambda x: 1 + list(s_grouped[x["Location"]]).index(x["Day"]) // 3, axis=1
)
# Now we want these unique per combination
df_pre = df[["Location", "Pre-Assign"]].drop_duplicates().reset_index().drop("index", 1)
df_pre["Assign"] = 'C' + (df_pre.index + 1).astype(str)
# result
df.merge(df_pre, on=["Location", "Pre-Assign"], how="left")
Результат
Другие кадры данных / серии: