синтаксический анализ столбцов данных, содержащих функции - PullRequest
0 голосов
/ 17 марта 2020

Python / pandas newb ie здесь. Файл CSV, с которым я пытаюсь работать, заполнен данными, которые выглядят примерно так:

A                                                      B            C       D
Option1(item1=12345, item12='string', item345=0.123)   2020-03-16   1.234   Option2(item4=123, item56=234, item678=345)

Я бы хотел, чтобы это выглядело так:

item1   item12     item345   B            C      item4   item56   item678
12345   'string'   0.123     2020-03-16   1.234  123     234      345

В Другими словами, я хочу заменить столбцы A и D новыми столбцами, озаглавленными тем, что находится слева от знака равенства, используя то, что справа от знака равенства, в качестве соответствующего значения, а также частями Option1 () и Option2 (). и запятые раздели. Столбцы, которые не содержат функций, следует оставить как есть.

Есть ли элегантный способ сделать это?

На самом деле, на этом этапе я бы согласился на любой старый способ, элегантный или нет; Я нашел разные способы справиться с этой ситуацией, если, скажем, в колонках были разные символы, но ничто не помогло бы мне разобраться, если там есть функции. Попытка найти ответ только дает мне кучу результатов о том, как применить функции к фреймам данных.

Ответы [ 2 ]

1 голос
/ 17 марта 2020

Пока ваши функции всегда имеют одинаковые аргументы, это должно работать.

Вы можете прочитать csv с помощью (если разделители 2 или более пробелов, это то, что я получаю, когда вставляю пример вашего вопроса) :

df = pd.read_csv('test.csv',sep='[\s]{2,}', index_col=False, engine='python')

Если ваш фрейм данных df:

# break out both sides of the equal sign in function into columns
A_vals = df['A'].str.extractall(r'([\w\d]+)=([^,\)]*)')

# get rid of the multi-index and put the values after '=' into columns
A_converted = A_vals.unstack(level=-1)[1]

# set column names to values before '='
A_converted.columns = list(A_vals.unstack(level=-1)[0].values[0])

# same thing for 'D'
D_vals = df['D'].str.extractall(r'([\w\d]+)=([^,\)]*)')
D_converted = D_vals.unstack(level=-1)[1]
D_converted.columns = list(D_vals.unstack(level=-1)[0].values[0])

# join everything together
df = A_converted.join(df.drop(['A','D'], axis=1)).join(D_converted)

В некоторых пояснениях к регулярному выражению '([\w\d]+)=([^,\)]*)' есть две группы захвата (каждая часть в паранах):

Группа 1 ([\w\d]+) - это один или несколько символов (+), которые являются символами слова \w или числами \d.

= между группами.

Группа 2 ([^,\)]*) - это 0 или более символов (*), которые не являются (^) запятой , или пареной \).

0 голосов
/ 17 марта 2020

Я полагаю, что вы ищете что-то вроде этого:

contracts = ["Option(conId=384688665, symbol='SPX', lastTradeDateOrContractMonth='20200116', strike=3205.0, right='P', multiplier='100', exchange='SMART', currency='USD', localSymbol='SPX   200117P03205000', tradingClass='SPX')",    
"Option(conId=12345678, symbol='DJX', lastTradeDateOrContractMonth='20200113', strike=1205.0, right='P', multiplier='200', exchange='SMART', currency='USD', localSymbol='DJXX   333117Y13205000', tradingClass='DJX')"]

new_conts = []
columns = []

for i in range (len(contracts)):
    mod = contracts[i].replace('Option(','').replace(')','')
    contracts[i] = mod    
    new_cont = contracts[i].split(',')
    new_conts.append(new_cont)

for contract in new_conts:
    column = []
    for i in range (len(contract)):
        mod = contract[i].split('=')
        contract[i] = mod[1]
        column.append(mod[0])
    columns.append(column)

print(len(columns[0]))
df = pd.DataFrame(new_conts,columns=columns[0])
df

Вывод:

    conId   symbol  lastTradeDateOrContractMonth    strike  right   multiplier  exchange    currency    localSymbol     tradingClass
0   384688665   'SPX'   '20200116'  3205.0  'P'     '100'   'SMART'     'USD'   'SPX 200117P03205000'   'SPX'
1   12345678    'DJX'   '20200113'  1205.0  'P'     '200'   'SMART'     'USD'   'DJXX 333117Y13205000'  'DJX'

Очевидно, что вы можете затем удалить ненужные столбцы, изменить имена и т. Д. c .

...