#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())