说我有如下文字文件:
apple pear banana, peach orange grape
dog cat white horse
salmon
tiger lion eagle hawk monkey
寻找输出:
"apple", "pear", "banana", "peach orange grape"
"dog", "cat", "white horse"
"salmon"
"tiger", "lion", "eagle hawk", "monkey"
两个问题,
如何将它们加载到pandas数据框中?
事实上,我想知道是否可以在不逐行阅读的情况下完成此操作,因为我的初步解决方案是:
读取每一行,使用REX
re.split(r' \ s {2,}',line)
以双倍空格分割
但是,由于列号是随机的,我不能简单地生成DF。 在pd.read_csv()中添加names = []将处理不均匀的列,但这需要预先定义列名和数字。
有什么建议吗?
谢谢!
答案 0 :(得分:2)
read_table()
是你的朋友......
df = pd.read_table('./test.txt', sep=" ", header=None)
df.to_csv('outfile.csv')
任何缺失的列都将填充NaN。
上面的文本文件test.txt如下:
test 2 1
t
t2 1
t3
t4 3 4
和df看起来像这样:
0 1 2
0 test 2.0 1.0
1 t NaN NaN
2 t2 1.0 NaN
3 t3 NaN NaN
4 t4 3.0 4.0
要在输出中获取引用,您可能需要使用csv中的quoting
选项:
import csv
import pandas as pd
df = pd.read_table('./test.txt', sep=" ", header=None)
df.to_csv(quoting=csv.QUOTE_NONNUMERIC)
答案 1 :(得分:1)
除了提供@JD Long提供的另一个示例之外,您还可以使用正则表达式和列表理解:
import re, pandas as pd
string = """
apple pear banana peach orange grape
dog cat white horse
salmon
tiger lion eagle hawk monkey
"""
rx = re.compile(r'''[ ]{2,}''')
items = [(rx.split(line)) for line in string.split("\n") if line]
df = pd.DataFrame.from_records(items)
print(df)
......产生:
0 1 2 3
0 apple pear banana peach orange grape
1 dog cat white horse None
2 salmon None None None
3 tiger lion eagle hawk monkey