从具有多个非常规分隔符的文件创建数据帧

2024-04-23 16:56:32 发布

您现在位置:Python中文网/ 问答频道 /正文

我正试图从一个.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

所以我基本上希望将索引空行的标签移到下面的一行。我没有尝试直接修改文件以提高效率,因为我有大约1000个类似的文件要进入数据帧。出于同样的原因,我不能仅仅重命名索引,因为有些文件的行数不一样。 有没有办法用熊猫来做这个?谢谢。你知道吗


Tags: 文件数据truedfreaddatatabletemp
1条回答
网友
1楼 · 发布于 2024-04-23 16:56:32

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

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  

相关问题 更多 >