Ersetzen verschiedener Zeichen mit 2 DataFrames

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
MarcusI
User
Beiträge: 1
Registriert: Donnerstag 9. Juni 2022, 14:38

Hallo,

ich bin noch relativ neu in Python und stehe gerade vor einem Problem, wo ich hoffe Ihr könnt mir helfen.

Ich habe zwei DataFrame's, eines beinhaltet Keywords mit Beschreibung, das andere ist meine Hauptdatenbank.
In der Hauptdatenbank soll eine Spalte nach Keywords durchsucht und gegen die Beschreibung aus der anderen ausgetauscht werden.
  • "result_dataframe" ist die Hauptdatenbank und beinhaltet 10 Spalten.
    Eine der Spalten heißt "Verwendung", in dieser soll die Zelle durchsucht und wenn ein Keyword gefunden wurden, gegen die entsprechende Beschreibung getaucht werden.

    "myDataFrame" ist mein DatenFrame mit den Keywords / Beschreibungen und hat nur diese 2 Spalten.
Mein Problem ist, dass die Spalte "Verwendung" in dem "result_dataframe" von NaN bis zu 5 möglichen Keywords beinhalten kann und die Keywords teilweise im Text stehen, z.B.
*Das Fett geschriebene ist das Keyword was ersetzt werden soll
  • GRU - B0332s9*"GRU"
    GRU - B0332s9*"GRU";OPT_MAT_2FARB - G1492347*"2"*"2"
    OPT_STICK - M83b2l01*"";OPT_MAT_2FARB - G1492347*"2"*"2"
    TSH01 - 01097413421854dGD
Die Keywords sehen so im "myDataFrame" aus:
  • Keyword Beschreibung
    0 B0332s9 Beispieltext {0}
    1 G1492347 {0} Beispieltext mit mehreren {1} Platzhaltern
    2 M83b2l01 Einfacher Beispieltext
    3 01097413421854dGD Weiterer Beispieltext

Mein Wunschergebnis wäre folgendes:
  • GRU - Beispieltext GRU
    GRU - Beispieltext GRU;OPT_MAT_2FARB - 2 Beispieltext mit mehreren 2 Platzhaltern
    OPT_STICK - Einfacher Beispieltext;OPT_MAT_2FARB - 2 Beispieltext mit mehreren 2 Platzhaltern
    TSH01 - Weiterer Beispieltext
Ich finde da einfach keinen grünen Zweig, wie ich da vorgehen kann...

Vielen Dank für Eure Hilfe.

Viele Grüße Marcus
Sirius3
User
Beiträge: 18279
Registriert: Sonntag 21. Oktober 2012, 17:20

Du mußt Dir einen Parser schreiben, der Keywords mit Parametern parsen kann. Dass das in einem Dataframe steht, ist hier irrelevant, weil Du eine Funktion schreiben mußt, die einen Text zerlegt und die Ersetzungen macht.
Wie der Parser genau aussehen muß, hängt stark davon ab, wie die wirkliche Syntax ist, und ob das immer eindeutig ist.
LukeNukem
User
Beiträge: 232
Registriert: Mittwoch 19. Mai 2021, 03:40

MarcusI hat geschrieben: Donnerstag 9. Juni 2022, 16:45 Mein Problem ist, dass die Spalte "Verwendung" in dem "result_dataframe" von NaN bis zu 5 möglichen Keywords beinhalten kann und die Keywords teilweise im Text stehen, z.B.
*Das Fett geschriebene ist das Keyword was ersetzt werden soll

Code: Alles auswählen

repl = {
    'B0332s9': 'Beispieltext {0}',
    'G1492347': '{0} Beispieltext mit mehreren {1} Platzhaltern',
     'M83b2l01': 'Einfacher Beispieltext',
     '01097413421854dGD': 'Weiterer Beispieltext'
}

def replace_func(x):
    if isinstance(x, str):
        for k, v in repl.items():
            x = x.replace(k, v)
    return x
            
df['replaced'] = df.spaltenname.apply(replace_func)
Benutzeravatar
__blackjack__
User
Beiträge: 14078
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@LukeNukem: Das ersetzt GRU - B0332s9*"GRU" zu GRU Beispieltext {0}*"GRU" und OPT_MAT_2FARB - G1492347*"2"*"2" zu OPT_MAT_2FARB - {0} Beispieltext mit mehreren {1} Platzhaltern*"2"*"2". Da sind ja dann immer noch die Platzhalter im Text und die Werte die dafür eingesetzt werden sollen. Ergebnisse sollten ja GRU Beispieltext GRU und OPT_MAT_2FARB - 2 Beispieltext mit mehreren 2 Platzhaltern sein.
“Vir, intelligence has nothing to do with politics!” — Londo Mollari
Benutzeravatar
__blackjack__
User
Beiträge: 14078
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

Sofern die Daten nicht komplizierter werden als das gezeigte, kann man da mit dem `regex`-Modul ran:

Code: Alles auswählen

#!/usr/bin/env python3
import regex as re

KEYWORD_TO_TEMPLATE = {
    "B0332s9": "Beispieltext {0}",
    "G1492347": "{0} Beispieltext mit mehreren {1} Platzhaltern",
    "M83b2l01": "Einfacher Beispieltext",
    "01097413421854dGD": "Weiterer Beispieltext",
}

EXAMPLES = [
    ('GRU - B0332s9*"GRU"', "GRU - Beispieltext GRU"),
    (
        'GRU - B0332s9*"GRU";OPT_MAT_2FARB - G1492347*"2"*"2"',
        "GRU - Beispieltext GRU;OPT_MAT_2FARB - 2 Beispieltext mit mehreren 2 Platzhaltern",
    ),
    (
        'OPT_STICK - M83b2l01*"";OPT_MAT_2FARB - G1492347*"2"*"2"',
        "OPT_STICK - Einfacher Beispieltext;OPT_MAT_2FARB - 2 Beispieltext mit mehreren 2 Platzhaltern",
    ),
    ("TSH01 - 01097413421854dGD", "TSH01 - Weiterer Beispieltext"),
    (42, 42),
]


def make_replacer(keyword_to_template):
    keyword_pattern = "|".join(map(re.escape, keyword_to_template))
    regex = re.compile(
        rf'(?P<keyword>{keyword_pattern})(\*"(?P<values>.*?)")*'
    )

    def replace_in(value):
        if isinstance(value, str):
            value = regex.sub(
                lambda match: (
                    keyword_to_template[match.group("keyword")].format(
                        *match.capturesdict().get("values", [])
                    )
                ),
                value,
            )

        return value

    return replace_in


def test_make_replacer():
    replace_in = make_replacer(KEYWORD_TO_TEMPLATE)
    for example, expected in EXAMPLES:
        assert replace_in(example) == expected


if __name__ == "__main__":
    test_make_replacer()
“Vir, intelligence has nothing to do with politics!” — Londo Mollari
Antworten