Seite 1 von 1

Ersetzen verschiedener Zeichen mit 2 DataFrames

Verfasst: Donnerstag 9. Juni 2022, 16:45
von MarcusI
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

Re: Ersetzen verschiedener Zeichen mit 2 DataFrames

Verfasst: Freitag 10. Juni 2022, 12:33
von Sirius3
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.

Re: Ersetzen verschiedener Zeichen mit 2 DataFrames

Verfasst: Sonntag 12. Juni 2022, 04:14
von LukeNukem
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)

Re: Ersetzen verschiedener Zeichen mit 2 DataFrames

Verfasst: Sonntag 12. Juni 2022, 07:07
von __blackjack__
@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.

Re: Ersetzen verschiedener Zeichen mit 2 DataFrames

Verfasst: Montag 13. Juni 2022, 22:10
von __blackjack__
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()