J'ai un bloc de données avec des valeurs comme ci-dessous

A B C D
1 2 3 4
5   6 7
8     9

Quand je lis le cadre ci-dessus dans Pandas en utilisant le ci-dessous

pd.read_csv(io.StringIO(raw_2), sep='\s+')

Il est lu comme

A B C   D
1 2 3   4
5 6 7   NaN
8 9 NaN NaN

Existe-t-il un moyen de conserver les colonnes vides et d'avoir le 9 sous la colonne D au lieu de B

2
Phoenix 16 mars 2019 à 06:58

2 réponses

Meilleure réponse

Vous avez besoin d'un lecteur qui lit les colonnes à largeur fixe:

pd.read_fwf(io.StringIO(raw_2))
#   A    B    C  D
#0  1  2.0  3.0  4
#1  5  NaN  6.0  7
#2  8  NaN  NaN  9

Cette procédure n'est pas garantie de fonctionner en général. Vous devrez peut-être spécifier manuellement la largeur des colonnes.

0
DYZ 16 mars 2019 à 04:12

Vous pouvez utiliser:

pd.read_csv(io.StringIO(raw_2), sep=r'\s{1,2}')

    A   B   C   D
0   1   2.0 3.0 4
1   5   NaN 6.0 7
2   8   NaN NaN 9

Qui utilise le motif regex \ s {1,2} comme séparateur. Cette expression régulière correspond à 1 ou 2 espaces blancs.

\ s {1,2} correspond à tout caractère d'espacement (égal à [\ r \ n \ t \ f \ v])

{1,2} Quantificateur - Correspond entre 1 et 2 fois, autant de fois que possible, en redonnant au besoin

1
Daniel Sobrado 16 mars 2019 à 04:20