Я работаю с большим CSV-файлом, и рядом с последним столбцом есть строка текста, которую я хочу разделить по определенному разделителю. Мне было интересно, если есть простой способ сделать это с помощью панд или питона?
CustNum CustomerName ItemQty Item Seatblocks ItemExt
32363 McCartney, Paul 3 F04 2:218:10:4,6 60
31316 Lennon, John 25 F01 1:13:36:1,12 1:13:37:1,13 300
Я хочу разделить пробел, (' ')
а затем двоеточие (':')
в Seatblocks
столбце, но каждая ячейка приведет к разному количеству столбцов. У меня есть функция для перестановки столбцов, чтобы Seatblocks
столбец находился в конце листа, но я не уверен, что делать дальше. Я могу сделать это в Excel с помощью встроенной text-to-columns
функции и быстрого макроса, но в моем наборе данных слишком много записей для обработки Excel.
В конечном счете, я хочу взять такие записи Джона Леннона и создать несколько строк с информацией о каждом наборе мест на отдельной строке.
Ответы:
Это разделяет блоки сидений по пробелам и дает каждому свой ряд.
Или, чтобы дать каждой строке, разделенной двоеточием, в своем собственном столбце:
Это немного некрасиво, но, возможно, кто-то подойдет к более хорошему решению.
источник
DataFrame
очень быстро увеличивает размер . В моем случае выполнение кода в таблице ~ 200M привело к использованию памяти ~ 10G (+ swap ...).split()
, что простоеreduce()
прохождение колонки работает как шарм. Тогда проблема может заключаться вstack()
...NameError: name 'Series' is not defined
за это. откудаSeries
взяться? РЕДАКТИРОВАТЬ: не имеет значения, это должно быть,pandas.Series
так как он ссылается на элемент отpandas
from pandas import Series
для удобства / краткости.В отличие от Дэна, я считаю его ответ довольно элегантным ... но, к сожалению, он также очень и очень неэффективен. Итак, поскольку в вопросе упоминается «большой CSV-файл» , позвольте мне предложить попробовать в оболочке решение Дэна:
... по сравнению с этой альтернативой:
... и это:
Второй просто воздерживается от выделения 100 000 Series, и этого достаточно, чтобы сделать это примерно в 10 раз быстрее. Но третье решение, которое несколько иронично тратит впустую много вызовов str.split () (оно вызывается один раз на столбец на строку, то есть в три раза больше, чем для двух других решений), примерно в 40 раз быстрее, чем первое, потому что он даже избегает экземпляров 100 000 списков. И да, это, конечно, немного некрасиво ...
РЕДАКТИРОВАТЬ: этот ответ предлагает, как использовать "to_list ()" и избежать необходимости лямбда. Результат примерно такой
который даже более эффективен, чем третье решение, и, конечно, гораздо более элегантен.
РЕДАКТИРОВАТЬ: еще проще
работает тоже, и почти так же эффективно.
РЕДАКТИРОВАТЬ: еще проще ! И обрабатывает NaNs (но менее эффективно):
источник
tolist()
идеально. В моем случае мне нужна была только одна из частей данных в списке, и я мог напрямую добавить один столбец к моей существующей df, используя .ix:df['newCol'] = pd.DataFrame(df.col.str.split().tolist()).ix[:,2]
obect of type 'float' has no len()
что сбивало с толку, пока я не понял, что некоторые из моих рядов былиNaN
в них, в отличие отstr
.Другое подобное решение с цепочкой - это использование
reset_index
иrename
:Если в столбце НЕ указаны
NaN
значения, самым быстрым решением является использованиеlist
понимания сDataFrame
конструктором:Но если столбец содержит
NaN
только работаетstr.split
с параметром,expand=True
который возвращаетDataFrame
( документация ), и это объясняет, почему он медленнее:источник
expand=True
опция, с которой можно работать, например,pandas.DataFrames
при использовании.str.split()
.Другой подход будет выглядеть так:
источник
Также можно использовать groupby () без необходимости объединения и stack ().
Используйте приведенный выше пример данных:
источник
0 31316 Lennon, John 25 F01 300 1:13:36:1,12 A
и следующая строка0 31316 Lennon, John 25 F01 300 1:13:37:1,13 B
Это кажется гораздо более простым методом, чем те, которые предлагаются в других разделах этой темы.
разделить строки в панде
источник