Панды: создать столбец со строковым значением на основе условий в других столбцах - PullRequest
0 голосов
/ 29 мая 2018

В кадре данных я хочу вычислить дополнительный столбец «требуемый_путь» (по умолчанию «требуемый столбец» - 123456), который объединяет значения из других 6 столбцов (c_flow 1, c_flow 2, c_flow 3, c_flow 4, c_flow 5,c_flow 6) следующим образом: если в строке в столбце 1 = 0,0 и в столбце 4 = 0,0 значение «требуемый_отход» становится равным: x23x56.

«try1» - это то, что я могу вывести в данный момент.

c_flow_1 = [1, 20, 0, 3, 0, 2]
c_flow_2 = [10, 20, 5, 10, 0, 0]
c_flow_3 = [10, 20, 0, 10, 1, 2]
c_flow_4 = [0, 20, 0, 10, 1, 2]
c_flow_5 = [10, 0, 1, 10, 1, 5]
c_flow_6 = [10, 0, 0, 10, 1, 2]
desired_output = ['123x56', '1234xx', 'x2xx5x', '123456','xx3456','1x3456']
data = pd.DataFrame({'c_flow 1': c_flow_1, 
                     'c_flow 2': c_flow_2, 
                     'c_flow 3': c_flow_3, 
                     'c_flow 4': c_flow_4,
                     'c_flow 5': c_flow_5, 
                     'c_flow 6': c_flow_6,
                     'desired_output': desired_output 
                    })

conditions = [data['c_flow 1'] == 0, data['c_flow 2'] == 0, data['c_flow 3'] == 0, 
              data['c_flow 4'] == 0, data['c_flow 5'] == 0, data['c_flow 6'] == 0 ]
choices = ['x23456', '1x3456', '12x456', '123x56', '1234x6', '12345x']
data['try1'] = np.select(conditions, choices, default ='123456')  

enter image description here

Ответы [ 2 ]

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

Я попробовал это (я знал, что это не эффективно), но все еще отправляю сообщение, чтобы получить идею

def cust(row):
    t=[]
    i=1
    for val in row:
        if val!=0:
            t.append(str(i))
        else:
            t.append('x')
        i+=1
    return ''.join(t)
print df.apply(cust,axis=1)
0 голосов
/ 29 мая 2018

Давайте используем небольшую математику, чтобы упростить задачу.

  1. Отфильтруйте нужные столбцы.Я использую DataFrame.filter, чтобы сделать это
  2. Получить маску ячеек> 0
  3. Умножить каждый ряд этой маски с диапазоном (вы хотите 1-6), используя DataFrame.mul
  4. Замените 0 в результате на x, используя DataFrame.replace
  5. Объедините строки в одну строку, используя DataFrame.agg

(data.filter(like='c_flow')   
     .gt(0)                   
     .mul(range(1, 7))        
     .replace(0, 'x')         
     .astype(str)             
     .agg(''.join, 1)         
)

0    123x56
1    1234xx
2    x2xx5x
3    123456
4    xx3456
5    1x3456
dtype: object
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...