[英]separate datafiles negative sign and white-space delimiter
我試圖將空格“”和“-”分別標識為列定界符。 我的文件有不一致被空格分隔的錯誤,例如:
8.55500000 42.93079187 -99.98428964 -0.59917942 20.86164814 8.37369433 0.56431509
8.55600000 42.94500503-100.05470144 -0.55062999 20.86380446 8.38865674 0.56429834
8.55700000 42.99565203-100.11651750 -0.54444340 20.87003752 8.39975047 0.55109542
8.55800000 42.99873154-100.07383720 -0.54648262 20.85777962 8.41246904 0.55645774
這是sep
的更復雜的使用,所以這就是解釋。 您不能僅在某些情況下將分隔符保留為列的一部分,因此這次代碼實際上將分隔符保留為列。 這被定義為一個可選的-
符號,后跟連續的數字。 這種方法將解決該問題,但是它將創建多個nan
列(已刪除)。 如果文件的列和行很大,這可能會導致 memory 問題。
from io import StringIO
S = '''
8.500000 42.93079187 -99.98428964 -0.59917942 20.86164814 8.37369433 0.56431509
8.55600000 42.94500503-100.05470144 -0.55062999 20.86380446 8.38865674 0.56429834
8.55700000 42.99565203-100.11651750 -0.54444340 20.87003752 8.39975047 0.55109542
8.55800000 42.99873154-100.07383720 -0.54648262 20.85777962 8.41246904 0.55645774'''
df = pd.read_csv(StringIO(S),
sep='\s*(-?[0-9\.]+)',
engine='python', header=None).dropna(axis=1)
df.head()
# 1 3 5 7 9 11 13
# 0 8.500 42.930792 -99.984290 -0.599179 20.861648 8.373694 0.564315
# 1 8.556 42.945005 -100.054701 -0.550630 20.863804 8.388657 0.564298
# 2 8.557 42.995652 -100.116518 -0.544443 20.870038 8.399750 0.551095
# 3 8.558 42.998732 -100.073837 -0.546483 20.857780 8.412469 0.556458
如果您所有的文件數據都是這種簡單格式,那么這種方法可以有效地生成行數據,pandas 可以使用這些數據來構建您的數據框。
>>> import re
>>>
>>> float_expr = re.compile(r"-?\d*\.?\d+")
>>>
>>> def gen_file_data(f):
... for line in f:
... line_data = float_expr.findall(line)
... yield (float(v) for v in line_data)
...
>>> df = pd.DataFrame.from_records(gen_file_data(open('filedata.txt', 'r')))
>>>
>>> df
0 1 2 3 4 5 6
0 8.555 42.930792 -99.984290 -0.599179 20.861648 8.373694 0.564315
1 8.556 42.945005 -100.054701 -0.550630 20.863804 8.388657 0.564298
2 8.557 42.995652 -100.116518 -0.544443 20.870038 8.399750 0.551095
3 8.558 42.998732 -100.073837 -0.546483 20.857780 8.412469 0.556458
>>>
Header 行?
>>> def gen_file_data(f):
... yield next(f).split() # Header row?
... for line in f:
... line_data = float_expr.findall(line)
... yield (float(v) for v in line_data)
...
>>> g = gen_file_data(open("filedata.txt", 'r'))
>>>
>>> df = pd.DataFrame.from_records(g, columns=next(g))
>>> df
foo bar baz qux quux quuz corge
0 8.555 42.930792 -99.984290 -0.599179 20.861648 8.373694 0.564315
1 8.556 42.945005 -100.054701 -0.550630 20.863804 8.388657 0.564298
2 8.557 42.995652 -100.116518 -0.544443 20.870038 8.399750 0.551095
3 8.558 42.998732 -100.073837 -0.546483 20.857780 8.412469 0.556458
>>>
生成器假定 header 行由標題組成,標題是由空格分隔的連續字符。 如果是其他模式,可以更新生成器的第一行來處理它。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.