строка split & concat из фрейма данных - PullRequest
0 голосов
/ 26 ноября 2018

Из фрейма данных я хочу разделить число (col1) перед первым символом | на список a, второе число после этого на список b и строку из (col1), (text1), (text2), (text3) в text список

col1       | text1     | text2           | text3
1|6|Show   | us the    | straight way    | null
109|2|I    | worship   | not that        | which ye worship

вывод, который я ожидал

a = [1, 109] b = [6, 2] text = [‘Show us the straight way’, ‘I worship not that which ye worship’]

Каков наилучший способ сделать это?

1 Ответ

0 голосов
/ 26 ноября 2018

Это просто, если предположить, что 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 может быть вычислено, как и раньше.

...