我正在尝试在熊猫中读取一些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
我只是在Python中使用Pandas的read_excel:
dataframe_parsed = pandas.read_excel(file_name)
print(dataframe_parsed.head())
我得到以下DataFrame作为输出:
Name Price
0 Coca Cola 46.66
1 Google\nFacebook 1204.44\n177.58
2 Berkshire Hathaway 306513.75
所需的输出是:
Name Price
0 Coca Cola 46.66
1 Google 1204.44
2 Facebook 177.58
3 Berkshire Hathaway 306513.75
任何帮助将不胜感激。
答案 0 :(得分:4)
在split
之后,您可以通过unnesting进行检查
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
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')
由于您上面提到的内容无效
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
答案 1 :(得分:0)
感谢WenBen的帮助。但是我无法让您的代码产生所需的输出。但是,使用您的unnesting链接,我想出了一个解决方案,该页面上@ user3483203的回答提供了一些帮助。我将解决方案发布在这里,以防万一它帮助遇到类似问题的人:
import pandas as pd
import numpy as np
def main():
# Make a simple dummy dataframe for testing
my_dataframe = pd.DataFrame({'ColA':["a1", "a2\na3", "a4\n a5 space"],'ColB':["b1", "b2\nb3","b4\nb5"]})
print("DataFrame before:\n", my_dataframe.head())
my_dataframe_after = myUnnesting(my_dataframe)
print("DataFrame after:\n", my_dataframe_after.head())
def myUnnesting(dataframe):
new_dataframe = pd.DataFrame()
for column in dataframe:
# Convert each column into an array of lists and concatenate these lists into a single array
col_vals = np.concatenate(np.array(dataframe[column].str.split("\n")))
new_dataframe[column] = col_vals
return new_dataframe
if __name__ == "__main__":
main()
输出:
DataFrame before:
ColA ColB
0 a1 b1
1 a2\na3 b2\nb3
2 a4\n a5 space b4\nb5
DataFrame after:
ColA ColB
0 a1 b1
1 a2 b2
2 a3 b3
3 a4 b4
4 a5 space b5
当然,此解决方案假定对于给定的行,每列中都有相同数量的\ n。对于我正在处理的数据,此假设非常合适。但是,如果有人读这篇文章想发布一个更通用的解决方案,该解决方案也适用于其他情况,将不胜感激。谢谢。