0
votes

Summarisation des données Pandas

J'ai une donnée floue, qui est aussi ci-dessous. Veuillez noter que le premier élément a des noms répétés (qui est un peu important à considérer). XXX

Si les données ci-dessus étaient dans un fichier appelé "OutTLET.txt", comment l'importerait-elle et résumer les données comme indiqué ci-dessous?

[Seuls les noms uniques restent, et pour chaque nom principal, seules des chaînes uniques seront remplacées à partir de tous les doublons existants] xxx


0 commentaires

4 Réponses :


3
votes

Vous pouvez charger les données dans un pandas dataframe : xxx

puis créer un fonction pour concaténer des listes sur une colonne Pandas: xxx

et enfin appliquer la fonction à la colonne: xxx


2 commentaires

Cher @franco Piccolo, merci pour votre gentil réponse, et j'ai un petit doute ici. Que se passe-t-il si les données sont dans un fichier comme "Output.txt" dois-je modifier l'extension en "CSV" et importer le DataFrame s'il vous plaît?


Oui, vous pouvez charger les données d'un CSV. Je ne pense pas que ce sera aussi simple cependant, car la liste sera lu sous forme de texte. Peut-être devriez-vous poser une autre question pour la partie importation.



1
votes
import ast
import csv
import pandas as pd

#load data from txt file, doesnt has to be csv, can be a txt file!
df = pd.read_csv(r"D:\test\output.txt", sep="/n", header=None, names=["data"], engine='python')

#convert text data to tupels and list
df["data"] = df["data"].map(lambda x: ast.literal_eval(x))
#extract surename
df["surename"] = df["data"].map(lambda x: x[0])
#extract list of strings
df["strings"] = df["data"].map(lambda x: x[1])
#create 1 row for each string in the list of strings
df = df.explode("strings")
#remove duplicate entries
df = df.drop_duplicates(subset=["surename", "strings"], keep="first")
#group the data by surename to get a list of unique strings (unique because we removed duplicates, order will be kept)
df_result = df.groupby(["surename"]).aggregate({"strings":list}).reset_index()
#combine both th extractd surename and the modified list of strings again
df_result["result"] = df_result.apply(lambda x: (x["surename"], x["strings"]), axis=1)

#output the data to a file of your choice
df_result[["result"]].to_csv(r"D:\test\result.txt",index=False, header=None, quoting=csv.QUOTE_NONE, escapechar = '')

0 commentaires

3
votes

Je suis d'accord que Pandas est une bibliothèque , mais ce genre de choses peut être faite très facilement avec des packages intégrés à python ordinaires 1 . Vous pouvez simplement utiliser python DefaultDict avec des ensembles et utilisez REGEX finditer pour l'analyse syntaxique.

1 a un sens surtout car votre entrée ni votre sortie ne figure dans aucun des types de données Pandas (PD.Series, pd.dataframe, ..) ou même un format standard .csv / tabulaire ..

code xxx

exemple de sortie xxx

expliquant comment le code fonctionne
  • ligne de lecture par ligne. Nous pouvons utiliser l'expression régulière que les captures tout ce qui est non-espaces ( \ S ) entre deux apostrophes ( ). Par conséquent, le motif est regex '(\ S +?) . Le plus + qui correspond à un ou plusieurs caractères et ? fait la recherche non gourmande (correspondre aussi peu de caractères possible), donc nous obtenons toutes les chaînes distinctes analysées, pas seulement une chaîne avec tout le contenu de la ligne.
  • the re.finditer est utilisé pour correspondre à plusieurs groupes avec le même motif. Dans ce cas, il est utilisé au lieu de re.findall depuis re.findall crée un et re.finditer crée un itérateur . (Petite optimisation: Ne créez pas la liste car elle n'est pas nécessaire du tout)
  • Ensuite, nous capturons en appelant le nom suivant () sur ITR . Il renvoie le premier élément de l'itérateur.
  • Alors, appelez le Groupes () < / Code> et prenez le premier élément de la valeur renvoyée. Voici comment les groupes capturés avec parenthèses ( () ) dans le modèle sont accessibles.
  • Ensuite, pour le reste de l'itérateur ITR Nous n'avons que des cordes à partir desquelles nous voulons créer Python Ensemble , quel quarantage éléments uniques. La syntaxe indiquée est la compréhension définie .
  • sur la même ligne, nous enregistrons l'ensemble résultant dans la variable DataSet , qui est un DefaultDict . DefaultDicts sont agréables depuis lors, lors de l'accès à un élément non existant, il crée automatiquement une entrée avec ce type. Nous avons utilisé defaultdict (set) pour avoir ensemble comme type par défaut. L'opération d [key] | = val est la même chose que d [key] = d [key] | val et le | crée un ensemble qui est le Union du nouvel ensemble et de l'ensemble, nous pourrions déjà avoir dans le jeu de données .
  • La dernière partie écrit tout juste la ligne par ligne à la sortie results.txt . Coulée chaînes à la liste est facultative, mais il est fait pour rendre la sortie similaire à ce qui était dans la question.


1 commentaires

WoWW



1
votes
data = []
a_dict = {}
unique = []

#considering that the file name is a.txt here.
#After opening the file i used the eval function to turn the string into code
#now the list data will have all the file's data, all elements inside list data are tuples
with open('a.txt','r') as file:
    for i in file.readlines():
        a = eval(i)
        data.append(a)

#here i wrote this code for collecting all unique name in a list
for i in data:
    if i[0] not in unique:
        unique.append(i[0])


#after collecting unique names inside list unique, i performed iteration over all values inside list unique.
#
#then i performed iteration on the list which is holding all the data
#
#compared all the unique values with the list data and
#then if they are matching then adding those values inside a list a_list
#
#when it is finished with the iteration inside list data, it will add that list into a dict a_dict with its unique value
#
#a_list will be assigned a new list for the next unique value
for i in unique:
    a_list = []
    for j in data:
        if i==j[0]:
            a_list.extend(j[1])
    a_dict[i] = list(tuple(a_list))
    
#This piece of code is to print out the data in a formatted way.
for i,j in a_dict.items():
    print("('{}', {})".format(i,j))
    

0 commentaires