У меня есть script
, который присваивает значение на основе двух columns
в pandas
df
. Код ниже может реализовать первый шаг, но я борюсь со вторым.
Таким образом, скрипт должен изначально:
1) Назначьте Person
для каждого отдельного string
в [Area]
и первого 3 unique values
в [Place]
2) Посмотрите, чтобы переназначить People
менее чем 3 unique values
Пример. df
ниже имеет 6 unique values
в [Area]
и [Place]
. Но 3 People
назначены. В идеале, 2
люди будут 2 unique values
каждый
d = ({
'Time' : ['8:03:00','8:17:00','8:20:00','10:15:00','10:15:00','11:48:00','12:00:00','12:10:00'],
'Place' : ['House 1','House 2','House 1','House 3','House 4','House 5','House 1','House 1'],
'Area' : ['X','X','Y','X','X','X','X','X'],
})
df = pd.DataFrame(data=d)
def g(gps):
s = gps['Place'].unique()
d = dict(zip(s, np.arange(len(s)) // 3 + 1))
gps['Person'] = gps['Place'].map(d)
return gps
df = df.groupby('Area', sort=False).apply(g)
s = df['Person'].astype(str) + df['Area']
df['Person'] = pd.Series(pd.factorize(s)[0] + 1).map(str).radd('Person ')
Выход:
Time Place Area Person
0 8:03:00 House 1 X Person 1
1 8:17:00 House 2 X Person 1
2 8:20:00 House 1 Y Person 2
3 10:15:00 House 3 X Person 1
4 10:15:00 House 4 X Person 3
5 11:48:00 House 5 X Person 3
6 12:00:00 House 1 X Person 1
7 12:10:00 House 1 X Person 1
Как видите, первый шаг работает нормально. или каждый отдельный string
в [Area]
, первый 3 unique values
в [Place]
назначается на Person
. Это оставляет Person 1
с 3 values
, Person 2
с 1 value
и Person 3
с 2 values
.
Второй шаг, где я борюсь.
Если Person
назначено меньше, чем 3 unique values
, измените это так, чтобы у каждого Person
было до 3 unique values
Предполагаемый результат:
Time Place Area Person
0 8:03:00 House 1 X Person 1
1 8:17:00 House 2 X Person 1
2 8:20:00 House 1 Y Person 2
3 10:15:00 House 3 X Person 1
4 10:15:00 House 4 X Person 2
5 11:48:00 House 5 X Person 2
6 12:00:00 House 1 X Person 1
7 12:10:00 House 1 X Person 1