0
votes

Comptez le nombre de lignes qui ont la même valeur, des lignes de 24 mil

J'ai donc cet énorme CSV, j'ai fait un script de test pour voir le nombre de lignes et renvoyer environ 24 millions de lignes. Je souhaite extraire le nombre de lignes qui ont le même numéro CIK et transférer ces données en CSV séparé.

de sorte que la sortie recherchée dans l'autre fichier serait la suivante:

Numéro CIK: Nombre d'IP avec ce numéro CIK.

J'avais des idées, mais ils n'étaient pas assez efficaces. Le script était donc inutile, car il a fallu pour des âges de passer par CSV. Alors quelqu'un est-il venu un problème de croix un problème similaire que j'ai?

Devrais-je utiliser des pandas pour cela, toute suggestion serait une aide énorme!

Exemple de CSV:

 Entrez la description de l'image ici


0 commentaires

3 Réponses :


1
votes

Vous pouvez utiliser pandas code> à groupy code> la colonne cik code>, puis utilisez la taille () code> pour obtenir le total Nombre de valeurs cik code>.

Par exemple, P>

chunks = []
for chunk in pd.read_csv('csv_name.csv', chunksize = 100):
    chunks.append(chunk)
df = pd.concat(chunks)


10 commentaires

Je ne suis pas connu avec les pandas, mais je vais essayer votre solution


@Stfan, j'ai peut-être mal compris votre sortie souhaitée. Vérifiez si mon édition est ce que vous voulez.


Pour lire dans un grand CSV dans Pandas Vous pouvez utiliser le paramètre chunksize , puis concaténer les plus petits DataFrames.


J'ai essayé votre solution passée @ hs-nébula mais mon script s'est écrasé, peut-être que cela ne peut pas gérer si grand fichier?


Et la question sur la sortie: numéro de CIK: Nombre d'IP avec ce numéro CIK


Cette dernière suggestion semble bonne. Mais comment mettre en œuvre un fichier CSV dans cela?


@Stefan Voir mon édition pour savoir comment lire dans le fichier. Pour le sauver, vous pouvez faire ce que j'ai suggéré dans la première partie.


Je pense que cela fonctionnera, mais ma peur est que cela prendra des âges à compléter et c'est quelque chose que je voulais éviter


@Stefan, vous pouvez bien sûr ajuster le morceau et voir qui prend le moins de temps. Vous pouvez également lire dans le fichier ligne-ligne comme suggéré dans une autre réponse, convertir à un fichier de données et utiliser mes suggestions.


Des liens comme ceux-ci peuvent vous aider https: // Stackoverflow. com / Questions / 25962114 / How -Aut-Read-A-6-gb-csv-file-with-PA NDAS @stefan. Cependant, je pense que l'utilisation de Pandas sera plus facile pour obtenir le compte. Vous ne pouvez également lire que dans les colonnes CIK et ip ( pd.read_csv (nom de fichier, usecols = ['CIK', 'IP']) ), faites-le en groupe, puis enregistrez les résultats. (De cette façon, vous ne copiez pas et que vous lisez tout le Dataframe.



-1
votes

Vous pouvez utiliser des pandas, mais ce n'est pas très efficace: xxx

mais la voie rapide et sale est de simplement diffuser le fichier et tirer avec une simple correspondance de chaîne, puis écrivez votre nouveau fichier. : xxx


3 commentaires

Python CSV lecteur est bien aussi, mais si vous ne faites que réaffecter le fichier exact, peut-être que vous n'en avez pas besoin? Je suppose que je suppose que vous ne voulez pas le gros objet en mémoire, vous voulez donc un simple flux.


Vous n'avez pas compris ma question, je ne veux pas entrer dans un CIK spécifique. Je veux que le script extrait le nombre d'IP a le même CIK pour chaque adresse IP de la CSV, mais avec la taille de la CSV, c'est un problème ...


Si vous diffusez chaque ligne, la taille n'a pas d'importance. Il ne chargera pas le fichier complet en mémoire.



2
votes

Que diriez-vous d'utiliser un compteur?

import collections, csv

with open("big.csv") as csvfile:
    counter = collections.Counter(row["cik"] for row in csv.DictReader(csvfile))

with open("out.csv", "w") as outfile:
    writer = csv.writer(outfile)
    writer.writerow(("cik", "count"))
    for cik, count in counter.items():
        writer.writerow((cik, count))


5 commentaires

C'est une bonne réponse. Vous pouvez également écrire facilement les résultats sur une ligne de ligne CSV, qui devrait également être rapide.


@brunns Eh bien, j'ai déjà essayé avec la collecte / le comptoir, mais j'ai eu des problèmes avec le code, probablement ma mauvaise implémentation de celui-ci. Cela fonctionne, mais il faut environ 9 minutes pour compléter la date et le CIK. Je ne sais pas que les pandas le font plus rapidement?


Désolé, je ne suis pas un utilisateur de Pandas. Peut-être que cela pourrait, mais je ne peux pas vous aider avec ça. Je viens de vous donner la meilleure solution que je puisse penser à python pur.


@ HS-Nébula, entre nous, vous êtes le plus familier avec Pandas, pouvez-vous répondre à ma question précédente?


@Stefan je veux dire, la façon de le faire dans les pandas est montrée dans ma réponse. Vous pouvez probablement lire dans le fichier à l'aide du module CSV dans une liste de listes, puis convertissez-la en Dataframe. Cela pourrait faire charger le fichier plus rapidement. Je ne suis pas sûr que le groupby sera plus rapide que cette réponse.