У меня довольно сложный рабочий процесс, который я постарался максимально упростить. Учитывая это DataFrame
...
df = pd.DataFrame(
[
["Johnson", "Female", 1.8, 1, 4],
["Johnson", "Female", 1.6, 2, 5],
["Johnson", "Female", 1.4, 3, 8],
["Johnson", "Female", 1.7, 4, 6],
["Johnson", "Male", 1.8, 4, 2],
["Johnson", "Male", 2.0, 2, 5],
["Johnson", "Male", 2.2, 2, 5],
["Smith", "Female", 1.7, 2, 2],
["Smith", "Female", 1.5, 4, 1],
["Smith", "Male", 1.7, 3, 3],
["Smith", "Male", 1.7, 3, 3],
["Smith", "Male", 1.9, 4, 3],
["Smith", "Male", 1.6, 2, 2],
],
columns=["Family", "Gender", "Height", "Hunger", "Thirst"],
)
... моя цель состоит из четырех частей:
- Группировка по семье и полу
- Иметь разные ограничения / пороговые значения для количества людей на определенной высоте (например, <1,7, <2,0) </li>
- Не принимать во внимание groupby с малой численностью населения
- Рассчитать оценку «Счастье» на основе моей метрики «Голод» и "Жажда"
Что-то вроде следующего:
scores = []
min_population_size = 1
# Step 1.
for group, dfg, in df.groupby(["Family", "Gender"]):
# Step 2.
for threshold in [1.7, 2.0]:
dfg_threshold = dfg[dfg["Height"] < threshold]
# Step 3. and 4.
if (count := len(dfg_threshold)) > min_population_size:
happiness = 1 - (1 / (dfg_threshold["Hunger"].mean() * dfg_threshold["Thirst"].mean())) # placeholder for complex calculation
else:
happiness = None
scores.append([group[0], group[1], threshold, count, happiness])
pd.DataFrame(scores, columns=["Family", "Gender", "Height-Threshold", "Count", "Happiness"])
Эта довольно уродливая реализация работает, но поскольку мой настоящий набор данных составляет около 80 ГБ, а у меня около 500 пороговых значений, этот цикл чрезвычайно трудоемкий. Есть ли способ преобразовать это в одну функцию groupby
или apply
, чтобы ее можно было выполнять параллельно через Dask или, по крайней мере, ускорить в Pandas?
Заранее спасибо.