web-dev-qa-db-fra.com

Comment ajouter une ligne d'en-tête à un pandas _ DataFrame

Je lis un fichier csv dans pandas. Ce fichier csv se compose de quatre colonnes et de quelques lignes, mais n’a pas de ligne d’en-tête, ce que je veux ajouter. J'ai essayé ce qui suit:

Cov = pd.read_csv("path/to/file.txt", sep='\t')
Frame=pd.DataFrame([Cov], columns = ["Sequence", "Start", "End", "Coverage"])
Frame.to_csv("path/to/file.txt", sep='\t')

Mais quand j'applique le code, j'obtiens l'erreur suivante:

ValueError: Shape of passed values is (1, 1), indices imply (4, 1)

Qu'est-ce que l'erreur signifie exactement? Et quel serait un moyen propre dans python d'ajouter une ligne d'en-tête à mon fichier csv/pandas df?

120
sequence_hard

Vous pouvez utiliser names directement dans le read_csv

names: semblable à un tableau, par défaut None Liste des noms de colonne à utiliser. Si le fichier ne contient aucune ligne d'en-tête, vous devez explicitement passer header = None.

_Cov = pd.read_csv("path/to/file.txt", 
                  sep='\t', 
                  names=["Sequence", "Start", "End", "Coverage"])
_
186
Leb

Alternativement, vous pouvez lire votre csv avec header=None puis l'ajouter avec df.columns:

Cov = pd.read_csv("path/to/file.txt", sep='\t', header=None)
Cov.columns = ["Sequence", "Start", "End", "Coverage"]
97
Anton Protopopov
col_Names=["Sequence", "Start", "End", "Coverage"]
my_CSV_File= pd.read_csv("yourCSVFile.csv",names=col_Names)

cela fait, vérifiez avec [bien évidemment je sais, vous le savez. Mais reste...

my_CSV_File.head()

J'espère que ça aide ... A la vôtre

9
Bhardwaj Joshi

Pour corriger votre code, vous pouvez simplement changer [Cov] en Cov.values, le premier paramètre de pd.DataFrame deviendra un tableau multidimensionnel numpy:

Cov = pd.read_csv("path/to/file.txt", sep='\t')
Frame=pd.DataFrame(Cov.values, columns = ["Sequence", "Start", "End", "Coverage"])
Frame.to_csv("path/to/file.txt", sep='\t')

Mais la solution la plus intelligente reste d'utiliser pd.read_Excel avec header=None et names=columns_list.

5
romulomadu

Comment ajouter une ligne d'en-tête à un pandas _ DataFrame?

Il y a deux cas à considérer:

  1. Le DataFrame n'a pas d'en-tête, ou
  2. Le DataFrame a déjà un en-tête, mais vous souhaitez lui ajouter un autre niveau.

Si vous avez un DataFrame sans en-tête et que ces données NE proviennent PAS d'un fichier CSV, affectez simplement l'attribut .columns:

df.columns = ['x', 'y', 'z']

Si les données proviennent de CSV/Excel, vous pouvez utiliser l'attribut names comme indiqué ici .

df = pd.read_csv('file.csv', header=None, names=['x', 'y', 'z'])

Si vous avez déjà un DataFrame avec des en-têtes sous la main et que vous souhaitez ajouter un autre niveau à vos en-têtes pour créer un MultiIndex, vous pouvez utiliser ,

# Setup
df = pd.DataFrame({'A': [1, 2, 3], 'B': [4, 5, 6]})
df

   A  B
0  1  4
1  2  5
2  3  6
new_level = ['C', 'D']
df.columns = [new_level, df.columns]
# Similar to,
# df.columns = pd.MultiIndex.from_arrays([new_level, df.columns])

df

   C  D
   A  B
0  1  4
1  2  5
2  3  6

df.columns
MultiIndex(levels=[['C', 'D'], ['A', 'B']],
           codes=[[0, 1], [0, 1]])

Sinon, si vous souhaitez ajouter un seul en-tête (par exemple, "foo"), utilisez plutôt from_product (c'est plus simple):

df.columns = pd.MultiIndex.from_product([['foo'], df.columns])
df

  foo   
    A  B
0   1  4
1   2  5
2   3  6

Notez que, lorsque vous enregistrez au format CSV, "foo" apparaît au-dessus de chaque colonne:

df.to_csv('file.csv', index=False)
!cat file.csv

foo,foo
A,B
1,4
2,5
3,6
1
cs95