Это просто, если предположить, что col1 имеет 3 элемента, разделенных трубами.
a,b,C = zip(*df.col1.str.split('|'))
D = df.drop('col1', 1).agg(lambda x: ' '.join(x.dropna()), axis=1)
c = [c + ' ' + d for c,d in zip(c,D)]
print(a)
('1', '109')
print(b)
('6', '2')
print(c)
['Show us the straight way', 'I worship not that which ye worship']
Обратите внимание, что a
и b
- это набор строк, выможно отобразить их в числовое значение с помощью
a, b = map(pd.to_numeric, (a,b))
..., чтобы получить массивы целых чисел.
Для обработки общего случая col1, имеющего любое количество значений, вам необходимо
v = df.col1.str.split('|', expand=True)
m = v.applymap(str.isdigit)
a,b,*_ = v[m].T.agg(lambda x: x.dropna().tolist(), axis=1)
print(a)
['1', '109']
print(b)
['6', '2']
C
может быть вычислено аналогично:
C = v[~m].agg(lambda x: x.dropna().str.cat(sep=' '), axis=1).tolist()
, а затем малое c
может быть вычислено, как и раньше.