J'ai reçu une demande pour extraire une ligne contenant un certain caractère en csv de 50 colonnes x 3 millions de lignes, donc je ne pouvais pas l'ouvrir dans Excel, alors je l'ai essayé avec Pandas.
*** grep *** Si vous l'utilisez, ne dites jamais ... C'est juste une pratique des pandas.
Il est difficile d'écrire en csv de 50 colonnes x 3 millions de lignes, voici donc des exemples de données. (Les données réelles sont NaN, donc c'était un peu plus compliqué.)
df = pd.DataFrame({"NAME":["Alice","Bob","Charly","Eve","Frank"],
"AGE":[10,20,30,20,10],
"ADDRESS":["TOKYO","OSAKA","TOKYO","OSAKA","AICHI"],
"COMPANY_PLACE":["TOKYO","TOKYO","AICHI","OSAKA","OSAKA"],
"BIRTH_PLACE":["TOKYO","OSAKA","TOKYO","OSAKA","OSAKA"]
})
df.head()
Pourquoi ne pas combiner toutes les colonnes et faire une recherche de correspondance partielle pour cette colonne!
df["P"] = df['ADDRESS'].str.cat(df['COMPANY_PLACE'], sep='-').str.cat(df['BIRTH_PLACE'], sep='-')
df
df[df["P"].str.contains("OSAKA")]
L'exemple a 5 colonnes, mais les données réelles ont 50 colonnes. C'est un peu pour les ajouter tous ...
df = df.drop("P",axis=1)
df["P"] = [""] * len(df)
for column in df.columns.values:
if column != "P":
df["P"] = df["P"].str.cat(df[column].astype(str), sep='-')
df[df["P"].str.contains("OSAKA")]
Puisqu'il existe un risque que les chaînes de caractères et les nombres soient mélangés, il est important d'utiliser astype (str) lors du classement.
df["P"] = [False] * len(df)
for column in df.columns.values:
df["P"] = df["P"] | df[column].astype(str).str.contains("OSAKA")
df[df["P"]]
Après tout, grep + awk est le plus puissant. C'était un bon entraînement, mais je me sentais noyé dans le plan ...
Recommended Posts