Итерирование операторов столбцов через строки данных в Python - PullRequest
0 голосов
/ 06 мая 2018

Я пытаюсь получить окончательный массив 'process' путем фильтрации необработанного массива 'hitdt' для '-1'; столбец, который содержит -1 в определенной строке в hitdt, будет определять значения этой строки в 'process'. Я использую операторы if в том, что я подозреваю, очень трудоемким способом, но не смог найти рабочие методы.

В настоящее время выполнение def frame() не возвращает никаких ошибок, но когда я проверяю результирующий массив 'process', новые столбцы остаются NaN. 'hitdt' - это фрейм входных данных с четырьмя рядами столбцов (от hitdt ['t1'] до hitdt ['t4']). 'process' - это пустой выходной фрейм данных. предыдущее добавление данных в столбцы серии hitdt, не включающее операторы if, было в порядке.

Есть ли способ определить, какой столбец определенной строки во фрейме данных == значение, затем применить операторы только к этой строке и выполнить итерацию по всем строкам?

def frame():
    global hitdt, process
    #v1 
    for i, row in hitdt.iterrows():
        if -1 == i in hitdt['t3']:
            process['tau1'] = hitdt['t2']-hitdt['t1']
            process['tau2'] = hitdt['t4']-hitdt['t1']
            process['xx'] = geom['x2']
            process['yy'] = geom['y2']
            process['rho1'] = sqrt(square(geom['x2']-geom['x1']) + square(geom['y2']-geom['y1']))
            process['alpha'] = 2.357067
        elif -1 == i in hitdt['t4']:
            process['tau1'] = hitdt['t3']-hitdt['t2']
            process['tau2'] = hitdt['t1']-hitdt['t2']
            process['xx'] = geom['x3']
            process['yy'] = geom['y3']
            process['rho1'] = sqrt(square(x3-x2) + square(y3-y2))
            process['alpha'] = 0.749619
        elif -1 == i in hitdt['t1']:
            process['tau1'] = hitdt['t4']-hitdt['t3']
            process['tau2'] = hitdt['t2']-hitdt['t3']
            process['xx'] = geom['x4']
            process['yy'] = geom['y4']
            process['rho1'] = sqrt(square(x3-x4) + square(y3-y4))
            process['alpha'] = -0.800233
        elif -1 == i in hitdt['t2']:
            process['tau1'] = hitdt['t1']-hitdt['t4']
            process['tau2'] = hitdt['t3']-hitdt['t4']
            process['xx'] = geom['x1']
            process['yy'] = geom['y1']
            process['rho1'] = sqrt(square(geom['x1']-geom['x4']) + square(geom['y1']-geom['y4']))
            process['alpha'] = -1.906772

...

[In]: process   
[Out]: 
jd      frac tau1 tau2 rho1   xx   yy alpha  hits
0     2457754  0.501143  NaN  NaN  NaN  NaN  NaN   NaN     3
1     2457754  0.508732  NaN  NaN  NaN  NaN  NaN   NaN     3
2     2457754  0.512411  NaN  NaN  NaN  NaN  NaN   NaN     3
3     2457754  0.513932  NaN  NaN  NaN  NaN  NaN   NaN     3

1 Ответ

0 голосов
/ 06 мая 2018

Я собираюсь решить только столбец tau1, потому что остальные просто повторяют одно и то же.

Ваш текущий код:

for i, row in hitdt.iterrows():
    if -1 == i in hitdt['t3']:
        process['tau1'] = hitdt['t2']-hitdt['t1']
    elif -1 == i in hitdt['t4']:
        process['tau1'] = hitdt['t3']-hitdt['t2']
    elif -1 == i in hitdt['t1']:
        process['tau1'] = hitdt['t4']-hitdt['t3']
    elif -1 == i in hitdt['t2']:
        process['tau1'] = hitdt['t1']-hitdt['t4']

Я бы сделал это:

if_t3 = hitdt['t2']-hitdt['t1']
if_t4 = hitdt['t3']-hitdt['t2']
if_t1 = hitdt['t4']-hitdt['t3']
if_t2 = hitdt['t1']-hitdt['t4']

condlist = [hitdt.t3 == -1, hitdt.t4 == -1, hitdt.t1 == -1, hitdt.t2 == -1]
default = np.nan
tau1 = [if_t3, if_t4, if_t1, if_t2]
process['tau1'] = np.select(condlist, tau1, default)
...