У меня есть фрейм данных с одним столбцом, и я хотел бы разбить его на два столбца, с одним заголовком столбца как ', fips'
а другой'row'
Мой фрейм данных df
выглядит так:
row
0 00000 UNITED STATES
1 01000 ALABAMA
2 01001 Autauga County, AL
3 01003 Baldwin County, AL
4 01005 Barbour County, AL
Я не знаю, как использовать df.row.str[:]
для достижения моей цели разделения строки строки. Я могу использовать, df['fips'] = hello
чтобы добавить новый столбец и заполнить его hello
. Любые идеи?
fips row
0 00000 UNITED STATES
1 01000 ALABAMA
2 01001 Autauga County, AL
3 01003 Baldwin County, AL
4 01005 Barbour County, AL
read_table()
илиread_fwf()
Ответы:
Возможно, есть лучший способ, но вот один из подходов:
источник
index = df.index
и вы хорошо.split
метод возвращает NaN, иtolist
метод вернет это значение как есть (NaN), что приведет кValueError
(чтобы преодолеть эту проблему, вы можете привести его к строковому типу перед разделением). Я рекомендую вам попробовать это самостоятельно, это лучший способ обучения :-)df
естьrow
заголовок столбца? Вы можете подумать, что это какой-то атрибут DataFrame, но совершенно ясно, что это имя столбца. Это зависит от вас, как вы создаете и определяете заголовки столбцов, поэтому, если вы используете другой, используйте его (напримерdf.my_column_name.split(...)
).TL; версия DR:
Для простого случая:
Самое простое решение:
Или вы можете автоматически создать DataFrame с одним столбцом для каждой записи разделения:
Вы должны использовать,
expand=True
если ваши строки имеют неоднородное количество разбиений, и вы хотитеNone
заменить отсутствующие значения.Обратите внимание, что в любом случае
.tolist()
метод не является обязательным. Ни то, ни другоеzip()
.В деталях:
Решение Энди Хейдена является превосходным в демонстрации силы
str.extract()
метода.Но для простого разбиения по известному разделителю (например, деление по тире или расщепление по пробелам) этого
.str.split()
метода достаточно 1 . Он работает со столбцом (Series) строк и возвращает столбец (Series) списков:1: Если вы не уверены, что делают первые два параметра
.str.split()
, я рекомендую документы для простой Python-версии метода .Но как вы идете от:
чтобы:
Что ж, нам нужно поближе взглянуть на
.str
атрибут столбца.Это магический объект, который используется для сбора методов, которые рассматривают каждый элемент в столбце как строку, а затем применяют соответствующий метод в каждом элементе настолько эффективно, насколько это возможно:
Но он также имеет интерфейс «индексации» для получения каждого элемента строки по его индексу:
Конечно, этот интерфейс индексации на
.str
самом деле не заботится о том, является ли каждый элемент, который он индексирует, действительно строкой, если он может быть проиндексирован, поэтому:Тогда вам просто нужно воспользоваться кортежем Python для распаковки итераций, чтобы сделать
Конечно, получение DataFrame из разбиения столбца строк настолько полезно, что
.str.split()
метод может сделать это для вас сexpand=True
параметром:Итак, еще один способ выполнить то, что мы хотели, это сделать:
expand=True
Версия, хотя и дольше, имеет явное преимущество по сравнению с методом кортежа распаковки. Распаковка кортежей не справляется с разбиениями разной длины:Но
expand=True
хорошо справляется с этим, помещаяNone
в столбцы, для которых недостаточно «разбиений»:источник
.split()
метода, которая объясняет первые два параметра лучше, чем документы Pandas.df.join(df['AB'].str.split('-', 1, expand=True).rename(columns={0:'A', 1:'B'}))
Вы можете аккуратно извлечь разные части, используя шаблон регулярных выражений:
Чтобы объяснить несколько длинное регулярное выражение:
\d
) и называет их"fips"
.Следующая часть:
Делает (
|
) одну из двух вещей:*
) заглавных букв или пробелов ([A-Z ]
) и называет это"state"
перед концом строки ($
),или
.*
) тогдаstate_code
до конца строки ($
).В примере:
обратите внимание, что первые две строки попадают в «состояние» (оставляя NaN в столбцах county и state_code), в то время как последние три строки попадают в округ, state_code (оставляя NaN в столбце state).
источник
(?P<label>...)
синтаксис! Я понятия не имею, почему я выбрал более сложное регулярное выражение, очевидно, что простое могло бы работать хммммм<group_name>
. Теперь я знаю, что это делает мой код очень лаконичным.источник
Если вы не хотите создавать новый фрейм данных или если ваш фрейм данных содержит больше столбцов, чем просто те, которые вы хотите разделить, вы можете:
источник
zip argument #1 must support iteration
об ошибке, Python 2.7Вы можете использовать
str.split
пробел (разделитель по умолчанию) и параметрexpand=True
дляDataFrame
присваивания новым столбцам:Модификация, если необходимо удалить оригинальный столбец с
DataFrame.pop
На что же похоже
Если получите ошибку:
Вы можете проверить и вернуть 4 столбца
DataFrame
, а не только 2:Затем раствор добавляют новые
DataFrame
поjoin
:С помощью удаления исходного столбца (если есть и другие столбцы):
источник
Если вы хотите разбить строку на более чем два столбца на основе разделителя, вы можете пропустить параметр 'Maximum Split'.
Ты можешь использовать:
Это автоматически создаст столько столбцов, сколько максимальное количество полей включено в любую из ваших исходных строк.
источник
Удивлен, я еще не видел этого. Если вам нужно только два сплита, я очень рекомендую. , ,
Series.str.partition
partition
выполняет один разделитель на разделитель, и, как правило, довольно производительный.Если вам нужно переименовать строки,
Если вам нужно присоединиться к оригиналу, используйте
join
илиconcat
:источник
Я предпочитаю экспортировать соответствующие серии панд (т.е. нужные мне столбцы), используя функцию apply, чтобы разбить содержимое столбцов на несколько серий, а затем соединить созданные столбцы с существующим DataFrame. Конечно, исходный столбец должен быть удален.
например
Для разделения двух слов строка функций должна выглядеть примерно так:
источник
Я видел, что никто не использовал метод среза, поэтому здесь я положил свои 2 цента здесь.
Этот метод создаст два новых столбца.
источник
Используйте
df.assign
для создания нового DF. См. Http://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy.источник