0
votes

La manière dont un code est écrit affecte-t-elle la vitesse de traitement de Pandas en python?

J'ai un fichier csv qui a 100 millions de lignes et qui utilise un PC avec 14 Go de RAM. Je l'ai coupé en deux parties de 50 millions de lignes chacune. J'attends depuis deux jours juste que le script exécute ce code:

.   Column1    Column2   Column 3 Column4
0   5487964     1.0       2.0       F
1   5587694     0.0         0     558769
2   7934852     1.0         0       F
3   5487964     0.0       2.0       F
4   1111111     0.0         0     111111
5   5487964     1.0       2.0       F

S'il y avait une méthode pour simplifier ce code, cela changerait-il l'heure d'exécution de ce code?

df['Column1']=df['Column1'].apply('{:0>7}'.format)
for index in df.index:
    if df.loc[index, 'Column2'] ==0.0 and df.loc[index,'Column3']==0:
        df.loc[index,'Column4'] = df.loc[index,'Column1'][:6]
    else:
        'F'


3 commentaires

Veuillez inclure quelques exemples d'entrée et de sortie attendue.


les boucles prennent beaucoup de temps même s'appliquent aussi. Vous pouvez utiliser numpy 'where' pour le rendre plus rapide. "df ['Colonne4'] = np.where (df.Colonne2 == 0 & df.Colonne3 == 0, df.Colonne1 [: 6], 'F')". Mais cela attribuera «F» à la colonne 4.


@sushanth Veuillez vérifier la modification


3 Réponses :


1
votes

À la place des pandas, essayez d'utiliser numpy parce que vous traitez beaucoup de données, même une seule amélioration peut aider ici. Naviguer sur des tableaux numpy prend moins de temps par rapport aux pandas Dataframe. Essayez de nous faire savoir si cela fonctionne pour vous, nous pourrons alors rechercher d'autres goulots d'étranglement.


0 commentaires

3
votes

La réponse est oui, la façon dont vous traitez les données est étroitement liée au temps de traitement.

Par exemple, lorsque vous écrivez des codes qui traitent des séries, le code s'exécute beaucoup plus rapidement que lorsque vous l'exécutez sur des lignes. vous pouvez améliorer votre code en utilisant ce code:

df.assign(Column4 = lambda x: np.where( (x['Column2'] == 0.0) & (x['Column3'] == 0.0), x['Column1'].str.slice(stop=6),'F'))

Parce que cela fonctionne sur des séries, pas sur chaque ligne

De plus, vous pouvez utiliser le multi-threading et la bibliothèque tqdm pour traiter plus rapidement et voir la progression du processus. Pour plus d'informations, consultez cet article .


7 commentaires

Est-ce que numpy me permet de me séparer. Est-ce que x['Column1'][:6] ok?


S'agit-il de chaînes de cellules?


Oui, je les ai convertis en chaînes pour me permettre de les diviser


pardonne-moi, j'ai corrigé mon erreur


Merci mec ... bon de savoir que votre problème est résolu. Dans les cas futurs, essayez d'utiliser NumPy pour traiter, mais si vous deviez traiter des lignes, essayez définitivement d'utiliser le multithreading et tqdm.


Continuons cette discussion en chat .


Veuillez vérifier la discussion



1
votes

Cela peut accélérer les choses. Vous pouvez peut-être vous assurer que Column1 est une chaîne lorsque vous lisez dataframe.

df['C5'] = np.where((df['Column1'] == 0) & (df['Column3'] == 0), df['Column1'][:6], 'F')


0 commentaires