Хорошо, похоже, я неправильно понял вопрос в начале (долгий день).ИМХО, ваш код работает должным образом (извините, я просто сгенерировал числа вместо дат):
import pandas as pd
import numpy as np
rows = 10000
dates = np.random.choice(range(10), size = rows)
Customer_IDs = np.random.choice(range(2*rows), size = rows, replace = False)
data = np.vstack([dates, Customer_IDs]).T
df = pd.DataFrame(data, columns = ["Date", "Customer_ID"])
df['Groups'] = df.groupby('Date')['Customer_ID']\
.transform(lambda x: np.random.choice(['Group_A', 'Group_B', 'Group_C'],
len(x), p= [0.1,0.45,0.45]))
print(df.groupby(['Date','Groups']).agg({'Date':'count'})\
.groupby(level = 0).apply(lambda x:100 * x / float(x.sum())) )
Теперь может быть некоторая случайность, и строго 10/45/45 очень маловероятно.
Я бы посоветовал проверить вручную, какое у вас распределение на конкретную дату, и сравнить с «фактической» таблицей:
from collections import Counter
test_date = 1 # change this to '1/3/2019' for example
cntr = Counter(df[df["Date"]==test_date]["Groups"])
cntr_sum = sum(cntr.values())
print( {k: np.round(100 * v/cntr_sum, 2)
for k,v in cntr.items()} )
PS.Надеюсь, у вас будет что-то подобное:
{'Group_B': 43.35, 'Group_C': 46.23, 'Group_A': 10.42}
Надеюсь, на этот раз я все понял!