2017-09-03 38 views
-1

我是Python新手,我已經發現這裏的帖子非常有幫助,但現在我被卡住了。我已經從電子郵件解析交易數據,並將其保存爲一個字符串對象,看起來像這樣:從多行字符串對象創建pd.dataframe

= E2 = 84 = 96 \ tOrderID \ tInstrument/ISIN \ tDirection \ tQuantity \ T = \ nPrice \ tAmount \ tDeal時間\ tSlppage \ t確認時間\ t = \ n結算時間\ tCommission \ t費用和費用\ t其他\ n> \ tPO59332737 \ tOil- 20Sep17 \ tBuy \ t100 \ t46.100000 \ t = \ n4610.00 USD \ t2017- 08-30 20:46:36 \ t0.000000 \ t2017-08-30 = \ n21:01:47 \ t2017-08-30 21:01:47 \ t0.000000 GBP \ t0.000000 GBP \ t = \ n \ n \ tPO59332799 \ tOil-20Sep17 \ tBuy \ t50 \ t46.100000 \ t = \ n2305.00 USD \ t2017-08-30 20:46:48 \ t0.000000 \ t2017-08- 30 = \ n21:01:47 \ t2017-08-30 21:01:47 \ t0.000000 GBP \ t0.000000 GBP \ t = \ n- \ n> \ tMO59332700 \ tOil-20Sep17 \ tBuy \ t100 \ t46.019000 \ t = \ n4601.90 USD \ t2017- 08-30 20:46:27 \ t0.000000 \ t2017-08-30 = \ n20:46:27 \ t2017-08-30 20:46:27 \ t0.000000 GBP \ t0.000000 GBP \ t = \ n \ n> \ n> \ n> \ n> \ n> \ n> \ n> \ n> \ n> \ n> \ n> \ n> \ n> \ n> \ n> \ n> \ n> \ n> \ n \ 。該片段顯示3行數據。 列以\ t分隔,電子郵件中的新行以\ n開頭。

我的目標是將此字符串轉換爲熊貓數據框對象,但我很努力。我試過用\ t\ n替換爲;,然後將字符串保存爲StringIO對象,並使用pd.read_csv從字符串中創建數據框。但是,這會將所有數據放入單獨的列中,以便最終生成0行。

如何操縱字符串對象,以便pd.read_csv自動識別新行何時開始。在csv文件中,新行以新行開始,但是,在我的字符串中,所有行都連接在一起。

任何幫助將不勝感激。 謝謝。

編輯:我意識到字符串中的新行以\ n>開頭。我如何使用它來指定數據框中的新行何時應該啓動?

回答

0

凌亂的一個。

我將文本保存到文件中的第一件事就是將其分割到\\n上,以便更容易理解並寫出這些文件。這使我看到了數據的幾大特點:

  • 有三條線「頭」,然後三根線在每個「記錄」,如果我忽略了由只是一個無關緊要的線「 - 」。
  • 我可以摺疊'>'不存在。
  • 熊貓對製表符很滿意。我可以用選項卡替換每個'\ t'。

>>> with open('simon.txt') as simon: 
...  for line in simon.read().split('\\n'): 
...   line 
...   
'=E2=84=96\\tOrderID\\tInstrument/ISIN\\tDirection\\tQuantity\\t=' 
'Price\\tAmount\\tDeal time\\tSlippage\\tConfirmation time\\t=' 
'Settlement time\\tCommission\\tCharges and fees\\tOther' 
'> 1\\tPO59332737\\tOil-20Sep17\\tBuy\\t100\\t46.100000\\t=' 
'4610.00 USD\\t2017-08-30 20:46:36\\t0.000000\\t2017-08-30 =' 
'21:01:47\\t2017-08-30 21:01:47\\t0.000000 GBP\\t0.000000 GBP\\t=' 
'-' 
'> 2\\tPO59332799\\tOil-20Sep17\\tBuy\\t50\\t46.100000\\t=' 
'2305.00 USD\\t2017-08-30 20:46:48\\t0.000000\\t2017-08-30 =' 
'21:01:47\\t2017-08-30 21:01:47\\t0.000000 GBP\\t0.000000 GBP\\t=' 
'-' 
'> 3\\tMO59332700\\tOil-20Sep17\\tBuy\\t100\\t46.019000\\t=' 
'4601.90 USD\\t2017-08-30 20:46:27\\t0.000000\\t2017-08-30 =' 
'20:46:27\\t2017-08-30 20:46:27\\t0.000000 GBP\\t0.000000 GBP\\t=' 
'-' 
'>' 
  • 正如我通過輸入文件I編號在n每行讀出。跳過的線條,即只包含連字符的線條不計算在內。
  • 當我在big_line中累積三行輸入時,我將它們加在一起,用製表符替換'\ t'字符並將結果寫入輸出文件。然後我重置big_line爲空,準備好接下來的三行。

>>> with open('simon.txt') as simon: 
...  with open('simon_out.txt', 'w') as simon_out: 
...   n = 0 
...   big_line = [] 
...   for line in simon.read().split('\\n'): 
...    if line=='-': 
...     pass 
...    else: 
...     n += 1 
...     if n % 3 == 1: 
...      if big_line: 
...       simon_out.write(' '.join(big_line).replace('\\t', '\t')+'\n') 
...       big_line = [] 
...     line = line.replace('>', '') 
...     big_line.append(line) 
...     
157 
157 
156 
157 

大熊貓的結果是可以接受的。它可能仍然需要一些按摩,這取決於您的要求。

>>> import pandas as pd 
>>> df = pd.read_csv('simon_out.txt', sep='\t') 
>>> df 
    =E2=84=96  OrderID Instrument/ISIN Direction Quantity = Price \ 
0   1 PO59332737  Oil-20Sep17  Buy  100 46.100 
1   2 PO59332799  Oil-20Sep17  Buy  50 46.100 
2   3 MO59332700  Oil-20Sep17  Buy  100 46.019 

      Amount   Deal time Slippage  Confirmation time \ 
0 = 4610.00 USD 2017-08-30 20:46:36  0.0 2017-08-30 = 21:01:47 
1 = 2305.00 USD 2017-08-30 20:46:48  0.0 2017-08-30 = 21:01:47 
2 = 4601.90 USD 2017-08-30 20:46:27  0.0 2017-08-30 = 20:46:27 

    = Settlement time Commission Charges and fees Other 
0 2017-08-30 21:01:47 0.000000 GBP  0.000000 GBP  = 
1 2017-08-30 21:01:47 0.000000 GBP  0.000000 GBP  = 
2 2017-08-30 20:46:27 0.000000 GBP  0.000000 GBP  = 
+0

非常感謝代碼,特別是對於評論,所以我可以理解線條之間發生了什麼。已應用您的方法併成功創建了一個pd.dataframe對象。 – Simon

+0

非常好。我很高興它有幫助。 –