@__blackjack__ @Kebap: Vielen Dank für eure Hilfe. Ich war im Urlaub, weshalb ich mich erst jetzt melden kann.
Beide Ansätze von euch funktionieren, danke dafür!
Da mir die Lösung mit pandas am besten gefallen hat und ich in diesem Gebiet mehr lernen möchte, habe ich mich an einer Ausweiterung des Codes gesetzt.
Mein Ziel war es, in dem 'result'-Dataset nach 2 weiteren Spalten zu filtern. Hierbei handelt es sich um Datums-Einträge mit dem Format JJJJ-MM-TT. Nennen wir Sie Spaltenkopf 5 & 6. Hier eine Bespieldatei:
Input:
Code: Alles auswählen
Spaltenkopf1 Spaltenkopf2 Spaltenkopf3 Spaltenkopf4 Spaltenkopf5 Spaltenkopf6
A5 B5 C5 D5 2010-12-06 2014-03-14
A6 B5 C6 D5 2014-04-13 2017-10-01
A7 B5 C7 D5 2017-11-01
A8 B7 C8 D7 2014-01-06 2014-03-14
A9 B7 C9 D7 2016-04-13 2017-10-01
A10 B10 C10 D10 2017-11-01 2017-12-04
A11 B10 C11 D10 2010-12-06 2014-03-14
A12 B12 C12 D12 2014-04-13 2017-10-01
A13 B12 C13 D12 2019-11-01 2020-03-14
Output:
Code: Alles auswählen
Spaltenkopf1 Spaltenkopf2 Spaltenkopf3 Spaltenkopf4 Spaltenkopf5 Spaltenkopf6
A5 B5 C5 D5 2010-12-06 2014-03-14
A6 B5 C6 D5 2014-04-13 2017-10-01
A7 B5 C7 D5 2017-11-01
Im Prinzip sollen immer nur die Werte mit der selben group-ids nach folgenden Kriterien verglichen werden:
Im Falle des Outputs:
1. Kriterium: (2014-04-13) - (2014-03-14) <70
2. Kriterium (2014-03-14) - (2010-12-06) >900.
In diesem Schema soll verglichen werden, also dementsprechend dann auch (2017-11-01) - (2017-10-01).
Nur wenn diese Kriterien erfüllt sind, möchte ich die ganze Zeile beibehalten. Zur Info: die 70 und die 900 sollen Tage darstellen.
Mein bisheriger Code nach stundenlangem Rumprobieren führte leider zu keinem richtigem Ergebnis, weil ich die eben genannten Kriterien nicht richtig formulieren kann.
Kann man hier wieder die groupby() und shift()-Funktion anwenden?
Zudem führten die Leerzellen in Spalte6 zu Problemen. Ich hätte die Leerzellen gerne zu 0 gesetzt, was jedoch nicht möglich ist, da es das Datumsformat haben muss. Hierbei ergibt sich leider wiederum das Problem, dass man 0000-00-00 nicht verwenden kann.
Mein bisheriger Code:
Code: Alles auswählen
import pandas as pd
def main():
data = pd.read_excel('C:\\Users\\Flo\\Documents\\MITNEHMEN2.0\\Uni\\Python\\TEST JOB/Test.xlsx').dropna(subset="Baum7")
fill_value = pd.to_datetime('2001-01-01', format='%Y-%m-%d')
data['Baum4'].fillna(fill_value, inplace=True)
data['Baum3'] = pd.to_datetime(data['Baum3'], format='%Y-%m-%d')
data['Baum4'] = pd.to_datetime(data['Baum4'], format='%Y-%m-%d')
grouping_data = data[["Baum2", "Baum7"]]
group_ids = (
(grouping_data != grouping_data.shift()).any(axis="columns").cumsum()
)
result = data.loc[
group_ids.groupby(group_ids)
.filter(lambda group: len(group) >= 2)
.index
]
# Zusätzliche Bedingungen
condition1 = ((data['Baum3'].shift() - data['Baum4'])).dt.days < 70
condition2 = ((data['Baum4'] - data['Baum3'])).dt.days > 900
# Ersetzen von NaN-Werten in den Bedingungen
condition1 = condition1.fillna(False)
condition2 = condition2.fillna(False)
combined_condition = condition1 & condition2
# Filtern der Gruppen-IDs basierend auf den Bedingungen
filtered_group_ids = group_ids[group_ids.map(lambda x: x if x in combined_condition.index else False)]
#filtered_group_ids = group_ids[group_ids.map(combined_condition)]
# Verwenden der gefilterten Gruppen-IDs, um das Ergebnis zu erstellen
result = data.loc[data.groupby(group_ids).filter(lambda group: group.name in filtered_group_ids.index).index]
print("\nErgebnis:")
print()
print(result)
if __name__ == "__main__":
main()