Versuchen Sie, Pandas zu verwenden, um einen Datenrahmen zu erstellen, der die Gesamtzeit der Zeit für jede Aufgabe über einen bestimmten Zeitraum enthält, und fügen Sie dann eine Spalte für jede Woche in die Daten hinzu und identifizieren dynamisch, welche Wochen hinzugefügt werden sollen.
Es fühlt sich wie eine Aufgabe an, die Pandas auszeichnen sollte, aber (wahrscheinlicher aufgrund meines Fachwissens) mache ich es am Ende sehr hässlich. Ich frage also nur, ob es einen besseren gibt Weg.
Beginnen wir mit dem Setup, ich habe einen Datenrahmen mit vier Wochen und fünf Aufgaben und einer zufälligen Anzahl von Stunden pro Aufgaben < /p>
generiert.import pandas as pd
import numpy as np
ramdomizer=np.random.default_rng(2025)
hours_array = ramdomizer.integers(2, 8, 15)
df = pd.DataFrame({
"Week": [ 1, 1, 1, 1, 1, 2, 2, 2, 3, 3, 3, 3, 4, 4, 4],
"Task": [ "Task 1", "Task 2", "Task 3", "Task 4", "Task 5", "Task 1", "Task 2", "Task 4", "Task 5", "Task 3", "Task 1", "Task 3", "Task 5", "Task 1", "Task 4"],
"Hours": hours_array
})
df
< /code>
Geben Sie mir einen schönen Datenrahmen, der wie
| aussieht | Woche | Aufgabe | Stunden |
| : --- | : --- | : --- | : --- |
| 0 | 1 | Aufgabe 1 | 4 |
| 1 | 1 | Aufgabe 2 | 7 |
| 2 | 1 | Aufgabe 3 | 7 |
| 3 | 1 | Aufgabe 4 | 4 |
| 4 | 1 | Aufgabe 5 | 7 |
| 5 | 2 | Aufgabe 1 | 6 |
| 6 | 2 | Aufgabe 2 | 5 |
| 7 | 2 | Aufgabe 4 | 7 |
| 8 | 3 | Aufgabe 5 | 6 |
| 9 | 3 | Aufgabe 3 | 7 |
| 10 | 3 | Aufgabe 1 | 4 |
| 11 | 3 | Aufgabe 3 | 2 |
| 12 | 4 | Aufgabe 5 | 4 |
| 13 | 4 | Aufgabe 1 | 3 |
| 14 | 4 | Aufgabe 4 | 4 | < /p>
und die Gesamtsumme ist einfach genug < /p>
summary_df = df.groupby("Task")["Hours"].sum()
summary_df
< /code>
Aufgabe < /th>
Stunden
< /th>
< /thead>
Aufgabe 1 < /td>
17 < /td>
< /tr>
Aufgabe 2 < /td>
12 < /td>
< /tr>
Aufgabe 3 < /td>
16 < /td>
< /tr>
< td style = "text-align: links;"> Aufgabe 4 < /td>
15 < /td>
< /tr>
Aufgabe 5 < /td>
17 < /td> < Br />
Noch schön und vorwärts, aber jetzt möchte ich die nächsten paar Spalten hinzufügen, Und vorzugsweise hatte ich das richtige Weg, um so etwas wie < /p>
zu tunfor week, week_data in df.groupby("Week"):
print(f"Processing week {week}")
summary_df[f"Week {week}"] = (week_data.loc[
week_data['Task'].eq[summary_df['Task']],
['Hours']].sum())
< /code>
, aber ich konnte diesen Ansatz einfach nicht erreichen.week_columns={}
print(summary_df.index)
for week, week_data in df.groupby("Week"):
current_week = []
print("---------------------------------------------------")
print(f"Processing week {week}")
for task in summary_df.index:
mask = week_data['Task'].eq(task)
task_hours = week_data.loc[mask, ["Hours"]].sum().iloc[0]
print(f"Found {mask.sum()} entries for {task} in week {week} totaling {task_hours} ")
current_week.append(task_hours)
week_columns[f"Week {week}"] = current_week
print(week_columns)
new_df = pd.DataFrame(
index= summary_df.index,
data= week_columns
)
new_df
< /code>
Es ist sehr ausführlich, aber es macht den Trick,
|
Aufgabe | Woche 1
| Woche 2
| Woche 3
| Woche 4
|
| : --- | : --- | : --- | : --- | : --- |
| Aufgabe 1 | 4 | 6 | 4 | 3 |
| Aufgabe 2 | 7 | 5 | 0 | 0 |
| Aufgabe 3 | 7 | 0 | 9 | 0 |
| Aufgabe 4 | 4 | 7 | 0 | 4 |
| Aufgabe 5 | 7 | 0 | 6 | 4 | < /p>
und ich können dann die beiden Datenfrüchte < /p>
beschlossenconcat_df = pd.concat([summary_df, new_df], axis=1)
concat_df
< /code>
Aufgabe < /th>
Stunden
< /th>
Woche 1
< /th>
Woche 2
< /th>
Woche 3
< /th>
Woche 4
< /th>
< /tr>
< /thead>
Aufgabe 1 < /td>
17
4
6
4
3
Aufgabe 2 < /td>
12 < / td>
7 < /td>
5 < /td>
0 < /td>
0 < /td>
< /tr>
Aufgabe 3 < /td>
16 < /td>
7 < /td>
0 < /td>
9 < /td>
0 < /td>
< /tr>
Aufgabe 4 < /td>
15 < /td>
4 < /td>
7 < /td>
0 < /td>
4 < /td>
< /tr>
Aufgabe 5 < /td>
17 < /td>
7
0
6
4
Aber es scheint verworren, gibt es eine einfachere "Pandas -Meisterschaft" -Sty?>
Dynamisch Spalten zu Pandas -Datenrahmen hinzufügen ⇐ Python
-
- Similar Topics
- Replies
- Views
- Last post