2016-10-14 2 views
-2

после синтаксического анализа большого PDF-документ я в конечном итоге со строкой в ​​формате в Python:строка панд dataframe

Company Name;(Code) at End of Month;Reason for Alteration No. of Shares;Bond Symbol, etc.; Value, etc.; after Alteration;Remarks 
Shares;Shares 
TANSEISHA CO.,LTD.;(9743)48,424,071;0 
MEITEC CORPORATION;(9744)31,300,000;0 
TKC Corporation;(9746)26,731,033;0 
ASATSU-DK INC.;(9747);42,155,400;Exercise of Subscription Warrants;0;May 2013 Resolution based 1;0Shares 
May 2013 Resolution based 2;0Shares 

было бы возможно превратить это в панд dataframe следующим образом, где столбцы ограниченный «;». Таким образом, глядя на предыдущем разделе из строки мой ДФ должен выглядеть следующим образом:

Company Name (Code) at End of Month Reason for Alteration .... 
Value,etc  after Alteration   Remarks Shares ..... 

Как дополнительная проблема мои строки не всегда имеют одинаковое число строк, разделенных «;», что означает, что я должен был бы найти способ увидеть мои столбцы (я не возражаю против установки как dataframe с 15 столбцами и последующего удаления тех, которые мне не нужны) Спасибо

+0

Я голосую нет! Я не могу разобрать, какая логика выводит нас из текста в предоставленный вами файл данных. – piRSquared

ответ

0

Я бы разделил ваше чтение в строке на список. Возможно, используйте регулярное выражение, чтобы найти начало каждой записи (или, по крайней мере, использовать то, что вы знаете, где оно появляется, похоже, что (Кодекс) в конце месяца может работать) и прорежьте свой путь. Что-то вроде этого:

import re 
import pandas as pd 

# Start your list of list off with your expected headers 
mystringlist = [["Company Name", 
       "(Code) at End of Month", 
       "Reason for Alteration", 
       "Value,etc", 
       "after Alteration", 
       "Remarks Shares"]] 

# This will be used to store the start and end indexes of each record 
indexlist = [] 

# A recursive function to find the start location of each record. It expects a list of 1s and 0s 
def find_start(thestring, startloc=0): 
    if startloc >=len(thestring): 
     return 
    else: 
     foundindex = thestring.find("1",startloc) 
     indexlist.append(foundindex) 
     return find_start(thestring, foundindex+1) 


# Split on your delimiter 
mystring = thestring.split(";") 

# Use a list comprehension to make your list of 1s 
# and 0s based on the location of a fixed regular expressible record 
stringloc = "".join([1 if re.match(x, "\(\d+\)\d+,\d+,\d+") else 0 for x in mystring]) 

find_start(stringloc) 

# Make your list of list based on found indexes 
# We subtract 1 from the index position because we want the element 
# that immediately precedes the element we find (it's an easier regex 
# to make when it's a consistent structure. 
for x in indexlist: 
    if mystringlist.index(x)+1 != len(indexlist): 
     mystringlist.append(mystring[x-1:indexlist[indexlist.index(x)+1]-1]) 

# Turn mystring list into a data frame 
mydf = pd.DataFrame(mystringlist) 
0

Это хорошая возможность использовать StringIO, чтобы сделать ваш результат выглядеть открытой ручкой файла, так что вы можете просто использовать pd.read_csv:

In [1]: import pandas as pd 

In [2]: from StringIO import StringIO 

In [3]: s = """Company Name;(Code) at End of Month;Reason for Alteration No. of Shares;Bond Symbol, etc.; Value, etc.; after Alteration;Remarks 
    ...: Shares;Shares 
    ...: TANSEISHA CO.,LTD.;(9743)48,424,071;0 
    ...: MEITEC CORPORATION;(9744)31,300,000;0 
    ...: TKC Corporation;(9746)26,731,033;0 
    ...: ASATSU-DK INC.;(9747);42,155,400;Exercise of Subscription Warrants;0;May 2013 Resolution based 1;0Shares 
    ...: May 2013 Resolution based 2;0Shares""" 

In [4]: pd.read_csv(StringIO(s), sep=";") 
Out [4]:     Company Name (Code) at End of Month Reason for Alteration No. of Shares     Bond Symbol, etc. Value, etc.    after Alteration Remarks 
0      Shares     Shares         NaN        NaN   NaN       NaN  NaN 
1   TANSEISHA CO.,LTD.  (9743)48,424,071         0        NaN   NaN       NaN  NaN 
2   MEITEC CORPORATION  (9744)31,300,000         0        NaN   NaN       NaN  NaN 
3    TKC Corporation  (9746)26,731,033         0        NaN   NaN       NaN  NaN 
4    ASATSU-DK INC.     (9747)       42,155,400 Exercise of Subscription Warrants   0.0 May 2013 Resolution based 1 0Shares 
5 May 2013 Resolution based 2    0Shares         NaN        NaN   NaN       NaN  NaN 

Заметьте, что он будет выглядеть как есть некоторые очевидные проблемы очистки данных, которые нужно решить, но это должно по крайней мере дать вам начало.

Смежные вопросы