从具有多个非常规分隔符的文件中创建熊猫数据框

时间:2018-08-01 13:17:53

标签: python pandas dataframe

我正在尝试从一个.data文件创建一个格式不大的数据框。 这是原始文本数据:

FICHE CLIMATOLOGIQUE;
;
Statistiques  1981-2010  et  records;
PARIS-MONTSOURIS (75)      Indicatif : 75114001, alt : 75m, lat : 48°49'18"N, lon : 02°20'12"E;
Edité le : 18/12/2017 dans l'état de la base;


            ;     Janv.;     Févr.;      Mars;     Avril;       Mai;      Juin;     Juil.;      Août;     Sept.;      Oct.;      Nov.;      Déc.;     Année;


La température la plus élevée (°C);
(Records établis sur la période du 01-06-1872 au 03-12-2017);
            ;      16.1;      21.4;      25.7;      30.2;      34.8;      37.6;      40.4;      39.5;      36.2;      28.9;      21.6;      17.1;      40.4;
Date        ;   05-1999;   28-1960;   25-1955;   18-1949;   29-1944;   26-1947;   28-1947;   11-2003;   07-1895;   01-2011;   07-2015;   16-1989;      1947;


Température maximale (Moyenne en °C);
            ;       7.2;       8.3;      12.2;      15.6;      19.6;      22.7;      25.2;        25;      21.1;      16.3;      10.8;       7.5;        16;


Température moyenne (Moyenne en °C);
            ;       4.9;       5.6;       8.8;      11.5;      15.2;      18.3;      20.5;      20.3;      16.9;        13;       8.3;       5.5;      12.4;


Température minimale (Moyenne en °C);
            ;       2.7;       2.8;       5.3;       7.3;      10.9;      13.8;      15.8;      15.7;      12.7;       9.6;       5.8;       3.4;       8.9;

我的第一次尝试未考虑除';'之外的定界符。我使用了pd.read_table()

df = pd.read_table("./file.data", sep=';', index_col=0, skiprows=7, header=0, skip_blank_lines=True, skipinitialspace=True)

这是我得到的结果:

first attempt result dataframe

如您所见,几乎所有索引都被移位,创建空行,并将“ NaN”作为实际包含我想要的数据的行的索引。 我认为这是由于某些分隔符看起来像这样:; ;。 因此,我尝试为sep参数提供一个匹配两种情况的正则表达式,以确保使用python引擎:

df = pd.read_table("./file.data", sep=';(\s+;)?', index_col=0, skiprows=7, header=0, skip_blank_lines=True, skipinitialspace=True, engine='python')

但是结果令人不满意,如下所示。 (我只使用了数据框的一部分,但是想法保持不变)。 我试过其他稍有不同的正则表达式,结果相似。

regex attempt result

因此,我基本上希望索引空行的标签移到下面的一行。我没有尝试直接修改文件来解决效率问题,因为我有大约一千个类似的文件可以放入数据框。出于同样的原因,我不能只重命名索引,因为某些文件不会具有相同的行数。 有办法使用熊猫吗?非常感谢。

1 个答案:

答案 0 :(得分:0)

您可以在导入后进行操作:

from io import StringIO
import numpy as np

datafile = StringIO("""FICHE CLIMATOLOGIQUE;
;
Statistiques  1981-2010  et  records;
PARIS-MONTSOURIS (75)      Indicatif : 75114001, alt : 75m, lat : 48°49'18"N, lon : 02°20'12"E;
Edité le : 18/12/2017 dans l'état de la base;


            ;     Janv.;     Févr.;      Mars;     Avril;       Mai;      Juin;     Juil.;      Août;     Sept.;      Oct.;      Nov.;      Déc.;     Année;


La température la plus élevée (°C);
(Records établis sur la période du 01-06-1872 au 03-12-2017);
            ;      16.1;      21.4;      25.7;      30.2;      34.8;      37.6;      40.4;      39.5;      36.2;      28.9;      21.6;      17.1;      40.4;
Date        ;   05-1999;   28-1960;   25-1955;   18-1949;   29-1944;   26-1947;   28-1947;   11-2003;   07-1895;   01-2011;   07-2015;   16-1989;      1947;


Température maximale (Moyenne en °C);
            ;       7.2;       8.3;      12.2;      15.6;      19.6;      22.7;      25.2;        25;      21.1;      16.3;      10.8;       7.5;        16;


Température moyenne (Moyenne en °C);
            ;       4.9;       5.6;       8.8;      11.5;      15.2;      18.3;      20.5;      20.3;      16.9;        13;       8.3;       5.5;      12.4;


Température minimale (Moyenne en °C);
            ;       2.7;       2.8;       5.3;       7.3;      10.9;      13.8;      15.8;      15.7;      12.7;       9.6;       5.8;       3.4;       8.9;""")

df = pd.read_table(datafile, sep=';', index_col=0, skiprows=7, header=0, skip_blank_lines=True, skipinitialspace=True)


df1 = pd.DataFrame(df.values[~df.isnull().all(axis=1),:], index=df.index.dropna()[np.r_[0,2:6]], columns=df.columns)

df_out = df1.dropna(how='all',axis=1)
print(df_out)

输出:

                                        Janv.    Févr.     Mars    Avril  \
La température la plus élevée (°C)       16.1     21.4     25.7     30.2   
Date                                  05-1999  28-1960  25-1955  18-1949   
Température maximale (Moyenne en °C)      7.2      8.3     12.2     15.6   
Température moyenne (Moyenne en °C)       4.9      5.6      8.8     11.5   
Température minimale (Moyenne en °C)      2.7      2.8      5.3      7.3   

                                          Mai     Juin    Juil.     Août  \
La température la plus élevée (°C)       34.8     37.6     40.4     39.5   
Date                                  29-1944  26-1947  28-1947  11-2003   
Température maximale (Moyenne en °C)     19.6     22.7     25.2       25   
Température moyenne (Moyenne en °C)      15.2     18.3     20.5     20.3   
Température minimale (Moyenne en °C)     10.9     13.8     15.8     15.7   

                                        Sept.     Oct.     Nov.     Déc. Année  
La température la plus élevée (°C)       36.2     28.9     21.6     17.1  40.4  
Date                                  07-1895  01-2011  07-2015  16-1989  1947  
Température maximale (Moyenne en °C)     21.1     16.3     10.8      7.5    16  
Température moyenne (Moyenne en °C)      16.9       13      8.3      5.5  12.4  
Température minimale (Moyenne en °C)     12.7      9.6      5.8      3.4   8.9