熊猫:如何从Excel文件中读取DataFrame,其中多行有时由换行符(\ n)分隔

Fri*_*ker 5 python excel parsing dataframe pandas

我正在尝试在熊猫中读取一些Excel文件。在某些文件中,目标表的格式不完美,即多行被格式化为单行,但每一行都有多行。因此,当您查看excel文件时,数据看起来很好。同样,使用pandas解析时,每行此类的末尾确实会有换行符(\ n)。

问题是,当我使用read_excel()函数读取它时,它会将其转换为DataFrame,该DataFrame不会将此换行符视为单独的一行,而是将其放入其中带有\ n的一行。我想编写一个代码,将N行这样的每一行都作为N行来对待/转换(使用换行符作为新行的指示器)。

有没有办法在解析文件时或在Python中对数据帧进行后处理?

在这里,我提供了我的虚拟excel文件的非常简化的版本以及一些解释该问题的代码。

样本Excel文件:

Name                | Price
-------------------------------
Coca Cola           |     46.66
-------------------------------
Google              |   1204.44
Facebook            |    177.58
-------------------------------
Berkshire Hathaway  | 306513.75
Run Code Online (Sandbox Code Playgroud)

我只是在Python中使用Pandas的read_excel:

dataframe_parsed = pandas.read_excel(file_name)
print(dataframe_parsed.head())
Run Code Online (Sandbox Code Playgroud)

我得到以下DataFrame作为输出:

                 Name            Price
0           Coca Cola            46.66
1    Google\nFacebook  1204.44\n177.58
2  Berkshire Hathaway        306513.75
Run Code Online (Sandbox Code Playgroud)

所需的输出是:

                 Name           Price
0           Coca Cola           46.66
1              Google         1204.44
2            Facebook          177.58
3  Berkshire Hathaway       306513.75
Run Code Online (Sandbox Code Playgroud)

任何帮助将不胜感激。

WeN*_*Ben 5

split您可以检查取消嵌套之后

yourdf=unnesting(df.apply(lambda x : x.str.split(r'\\n')),['Name','Price'])
yourdf
Out[50]: 
                 Name      Price
0           Coca Cola      46.66
1              Google    1204.44
1            Facebook     177.58
2  Berkshire Hathaway  306513.75
Run Code Online (Sandbox Code Playgroud)
def unnesting(df, explode):
    idx = df.index.repeat(df[explode[0]].str.len())
    df1 = pd.concat([
        pd.DataFrame({x: np.concatenate(df[x].values)}) for x in explode], axis=1)
    df1.index = idx

    return df1.join(df.drop(explode, 1), how='left')
Run Code Online (Sandbox Code Playgroud)

由于你上面提到的不起作用

df.apply(lambda x : x.str.split(r'\\n')).stack().apply(pd.Series).stack().unstack(level=1).reset_index(drop=True)
Out[57]: 
                 Name      Price
0           Coca Cola      46.66
1              Google    1204.44
2            Facebook     177.58
3  Berkshire Hathaway  306513.75
Run Code Online (Sandbox Code Playgroud)