Разделение данных в строках Pandas на новый столбец

#python #pandas #dataframe

#python #pandas #фрейм данных

Вопрос:

Я мог бы кодировать построчно для достижения результата, но очень признателен, если кто-нибудь сможет продемонстрировать это с помощью циклов.

Исходный файл:

    Col1   
0  A1-Text1;A2-Text2
1  A1-Text1;A2-Text2
2  A2-Text2;A3-Text3;A4-Text4;A6-Text7  
3  A1-Text1;A2-Text2;A4-Text4
 

Желаемый результат:

    Col1   Col2   Col3   Col4  
0  A1     A2     None   None  
1  A1     A2     None   None
2  A2     A3     A4     A6
3  A1     A2     A4     None
 

Обновляя мой запрос, как мне работать с этим вместо этого?

    Col1   
0  A11.2-Text1;H22.0-Text2
1  A49.8-Text1;K52.8-Text2
2  Q28.3-Text2;D35.5-Text3;A64.5-Text4;A76.7-Text7  
3  A15.8-Text1;A27.5-Text2;A47.8-Text4
 

Ответ №1:

Вы можете использовать str.findall с regex шаблоном:

 out = pd.DataFrame(df['Col1'].str.findall(r'([A-Z0-9.] )-').tolist())
 

В качестве альтернативы вы можете попробовать .str.extractall unstack :

 out = df['Col1'].str.extractall(r'([A-Z0-9.] )-')[0].unstack()
 

 print(out)

       0      1      2      3
0  A11.2  H22.0   None   None
1  A49.8  K52.8   None   None
2  Q28.3  D35.5  A64.5  A76.7
3  A15.8  A27.5  A47.8   None
 

Комментарии:

1. Спасибо за быстрый ответ. После поиска вашего решения в Google я понял, что вы используете регулярное выражение. Если я могу спросить дальше, содержат ли мои данные другие алфавиты, отличные от A, и есть float, как мне изменить код? Col1 0 A11.2-Text1; H22.0-Text2 1 A49.8-Text1;K52.8-Text2 2 Q28.3-Text2; D35.5-Text3;A64.5-Text4;A76.7-Text7 3 A15.8-Text1; A27.5-Text2;A47.8-Text4

2. @Juxcy В этом случае, я думаю, вы можете попробовать pd.DataFrame(df['Col1'].str.findall(r'(?i)([A-Z0-9.] )-').tolist())