将 excel 或 csv 文件转换为 pandas 多级数据框
Posted
技术标签:
【中文标题】将 excel 或 csv 文件转换为 pandas 多级数据框【英文标题】:Convert excel or csv file to pandas multilevel dataframe 【发布时间】:2012-09-16 13:53:24 【问题描述】:我收到了一个相当大的 Excel 文件(5k 行),也是 CSV,我想将其制作成 pandas 多级 DataFame。该文件的结构如下:
SampleID OtherInfo Measurements Error Notes
sample1 stuff more stuff
36 6
26 7
37 8
sample2 newstuff lots of stuff
25 6
27 7
测量次数可变(有时为零)。任何信息之间都没有完整的空白行,并且“测量”和“错误”列在具有其他(字符串)数据的行上为空;这可能会使解析变得更加困难(?)。有没有一种简单的方法可以自动进行这种转换?我最初的想法是先用 Python 解析文件,然后在循环中将内容输入 DataFrame 插槽,但我不知道具体如何实现它,或者它是否是最好的做法。
提前致谢!
【问题讨论】:
【参考方案1】:看起来您的文件有固定宽度的列,可以使用 read_fwf()。
In [145]: data = """\
SampleID OtherInfo Measurements Error Notes
sample1 stuff more stuff
36 6
26 7
37 8
sample2 newstuff lots of stuff
25 6
27 7
"""
In [146]: df = pandas.read_fwf(StringIO(data), widths=[12, 13, 14, 9, 15])
好的,现在我们有了数据,只需一点点额外的工作,您就有了一个框架,您可以在该框架上使用 set_index() 创建多级索引。
In [147]: df[['Measurements', 'Error']] = df[['Measurements', 'Error']].shift(-1)
In [148]: df[['SampleID', 'OtherInfo', 'Notes']] = df[['SampleID', 'OtherInfo', 'Notes']].fillna()
In [150]: df = df.dropna()
In [151]: df
Out[151]:
SampleID OtherInfo Measurements Error Notes
0 sample1 stuff 36 6 more stuff
1 sample1 stuff 26 7 more stuff
2 sample1 stuff 37 8 more stuff
4 sample2 newstuff 25 6 lots of stuff
5 sample2 newstuff 27 7 lots of stuff
【讨论】:
谢谢,Wouter。你让我的生活变得轻松了很多。【参考方案2】:这至少会清理它以进行额外处理。
import csv
reader = csv.Reader(open(<csv_file_name>)
data = []
keys = reader.next()
for row in reader():
r = dict(zip(keys,row))
if not r['measurements'] or not r['Error']:
continue
for key in ['SampleID', 'OtherInfo', 'Notes']:
if not r[key]:
index = -1
while True:
if data[index][key]:
r[key] = data[index][key]
break
index -= 1
data.append(r)
【讨论】:
谢谢,大卫。这不是我正在寻找的直接解决方案,但对解析文件很有指导意义。以上是关于将 excel 或 csv 文件转换为 pandas 多级数据框的主要内容,如果未能解决你的问题,请参考以下文章
如何通过在 Python 中将两个列表合并为一个,使用 CSV 模块或 Pandas 写入 csv 或 Excel 文件?
使用 python 将 XLSX 正确转换为 CSV [关闭]
unotools - 尝试使用 python 将 ods 或 excel 文件转换为 csv
如何将 Python 列表转换为 pandas DataFrame 或 excel 文件输出,具体要求如下: