J'ai un dataframe relativement volumineux avec plus de cent colonnes. Actuellement, seule la première colonne a reçu un nom et le dataframe ressemble à:
Event Name1 Job1 Name2 Job2 Name3 Job3 Name4 Job4 Name5 Job5 Name6 Job6 ...
Je voudrais renommer les colonnes pour qu'elles ressemblent à
Event 0 1 2 3 4 5 6 7 8 9 10 11 ...
3 Réponses :
Voici un autre exemple:
Event Name1 Job1 Name2 Job2 Name3 0 1 1 1 1 1 1 1 2 2 2 2 2 2 2 3 3 3 3 3 3
import pandas as pd
a = {}
a["Event"] = [1,2,3]
a[0] = [1,2,3]
a[1] = [1,2,3]
a[2] = [1,2,3]
a[3] = [1,2,3]
a[4] = [1,2,3]
df = pd.DataFrame(a)
name = 1
job = 1
for i in df.keys()[1:]:
if i%2==0:
df = df.rename(columns={i: "Name"+str(name)})
name+=1
else:
df = df.rename(columns={i: "Job"+str(job)})
job+=1
print(df)
Nous devons faire trois choses:
liste des colonnes actuelles. liste en utilisant la liste que nous avons obtenue à l ' étape 1 . liste aux colonnes de notre DataFrame . 1:
In [9]: df.columns = new_cols In [10]: df Out[10]: Empty DataFrame Columns: [Event, Name1, Job1, Name2, Job2, Name3, Job3, Name4, Job4, Name5, Job5, Name6, Job6] Index: []
2:
In [4]: num_cols = len(list(df))
In [5]: num_cols
Out[5]: 13
In [6]: new_cols = []
In [7]: for i in range(num_cols):
...: if i == 0:
...: new_cols.append("Event")
...: elif i % 2 == 0:
...: new_cols.append(f'Job{int(i/2)}')
...: else:
...: new_cols.append(f'Name{int((i+1)/2)}')
In [8]: new_cols
Out[8]:
['Event',
'Name1',
'Job1',
'Name2',
'Job2',
'Name3',
'Job3',
'Name4',
'Job4',
'Name5',
'Job5',
'Name6',
'Job6']
3:
In [1]: import pandas as pd In [2]: df = pd.DataFrame(columns=['Event', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '10', '11']) In [3]: df Out[3]: Empty DataFrame Columns: [Event, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11] Index: []
C'est vraiment clair. Cela aide également à comprendre d'autres réponses que j'ai vues en lisant des questions similaires. Merci beaucoup!
@TaoHan Salut, votre problème est-il résolu? Si tel est le cas, n'hésitez pas à accepter une réponse.
Salut Amir. Oui, c'est résolu et j'ai voté mais mon score est trop faible (avant 15) donc le vote n'est pas affiché ....
@TaoHan Vous pouvez toujours accepter une réponse.
Que diriez-vous d'utiliser 2 listcomp et zip et from_iterable pour aplatir zip:
from itertools import chain num_cols = 20 name = ['Name'+str(i) for i in range(1, num_cols)] job = ['Job'+str(i) for i in range(1, num_cols )] df.columns = ['Event'] + list(chain.from_iterable(zip(name, job))) Out[1918]: ['Event', 'Name1', 'Job1', 'Name2', 'Job2', 'Name3', 'Job3', 'Name4', 'Job4', 'Name5', 'Job5', 'Name6', 'Job6', 'Name7', 'Job7', 'Name8', 'Job8', 'Name9', 'Job9', 'Name10', 'Job10', 'Name11', 'Job11', 'Name12', 'Job12', 'Name13', 'Job13', 'Name14', 'Job14', 'Name15', 'Job15', 'Name16', 'Job16', 'Name17', 'Job17', 'Name18', 'Job18', 'Name19', 'Job19']
Veuillez ajouter le code que vous avez essayé dans votre question, afin qu'il soit plus facile pour les gens de détecter le problème.
Je comprends. C'est juste que le code que j'ai écrit est vraiment foiré, et je ne pense pas vraiment qu'il aurait de la valeur ... Mais je le garderai à l'esprit la prochaine fois que je poserai une question :)
Je ne pense pas vraiment que cela aurait une quelconque valeur, cela aura de la valeur, car 1) les gens peuvent voir que vous avez essayé quelque chose et vous ne leur demandez pas seulement pour écrire du code pour vous. 2) Ce sera beaucoup plus facile de résoudre le problème. Je garderai cela à l'esprit la prochaine fois que je poserai une question, parfait!