Dynamisch Spalten zu Pandas -Datenrahmen hinzufügenPython

Python-Programme
Anonymous
 Dynamisch Spalten zu Pandas -Datenrahmen hinzufügen

Post by Anonymous »

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?>

Quick Reply

Change Text Case: 
   
  • Similar Topics
    Replies
    Views
    Last post