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?
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"])
_
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"]
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
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
.
Comment ajouter une ligne d'en-tête à un pandas _ DataFrame?
Il y a deux cas à considérer:
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