2 votes

Optimisation des performances dans la transformation des dataframes de pandas en utilisant actuellement "for loop".

J'utilise habituellement python pour mes recherches, mais c'est la première fois que je manipule un grand ensemble de données (plus de cent millions de lignes réparties en plusieurs fichiers), et une vieille mais bonne station de travail (CPU Xeon E5-2637 v4, GPU Quadro K420).

Toute aide pour accélérer l'algorithme ci-dessous serait grandement appréciée. Je cherche actuellement à améliorer les performances pour optimiser le matériel et utiliser groupe par pour peut-être changer mon code de boucle for, mais en vain. J'ai également consulté les questions précédentes, mais je (crois) que ce dont j'ai besoin est plus élémentaire.

Le format des données est le suivant. (même format pour tous les fichiers)

C:/../data1.csv
--
  col1  col2  col3
parent abcde   NaN
 child   d3d   a1a
 child   s2s   f4f
parent fghij   NaN
 child   g5g   h6h
 child   j7j   k8k

Mon code original

#list of file locations
filelist = {'files': ['C:/../data1.csv', 'C:/../data2.csv', 'C:/../data3.csv']}
filelist_df = pd.DataFrame(data=filelist)
filelist_df = filelist_df["files"].str.strip("[]")

#data transformation
column_names=['1', '2', '3', '4']
temp_parent=[]

for i in range(3):
  new_df=pd.DataFrame(columns=column_names)
  data_df=pd.read_csv(filelist_df[i], skiprows=1, names=column_names)
  for j in range(len(data_df)):
    if data_df['1'][j]=='parent':
      temp_parent=data_df['2'][j]
    else:
      data_df['4'][j]=temp_parent
      temp_row=data_df.loc[j,:]
      new_df = new_df.append(temp_row, ignore_index=True)
  new_df.to_csv('C:/../new%d' % i + '.csv', index=False, header=False)
  del new_df, data_df, temp_parent, temp_row

Sortie (seulement pour data1.csv) :

C:/../new0.csv
--
 child   d3d   a1a abcde
 child   s2s   f4f abcde
 child   g5g   h6h fghij
 child   j7j   k8k fghij

3voto

Andrej Kesely Points 20452

Si je vous comprends bien, vous voulez créer une nouvelle colonne avec une valeur de parent rang, col2 colonne :

mask = df.col1.eq("parent")

df["col4"] = df.loc[mask, "col2"]
df["col4"] = df["col4"].ffill()
print(df[~mask])

Imprimés :

    col1 col2 col3   col4
1  child  d3d  a1a  abcde
2  child  s2s  f4f  abcde
4  child  g5g  h6h  fghij
5  child  j7j  k8k  fghij

Cadre de données d'entrée :

     col1   col2 col3
0  parent  abcde  NaN
1   child    d3d  a1a
2   child    s2s  f4f
3  parent  fghij  NaN
4   child    g5g  h6h
5   child    j7j  k8k

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X