Разбейте ряд Pandas на несколько столбцов DataFrame в зависимости от положения строки - PullRequest
0 голосов
/ 20 сентября 2018

Учитывая Pandas Series со строками, я хотел бы создать DataFrame со столбцами для каждой секции Series на основе позиции.

Например, учитывая этот вход:

s = pd.Series(['abcdef', '123456'])
ind = [2, 3, 1]

В идеале я бы получил это:

target_df = pd.DataFrame({
  'col1': ['ab', '12'],
  'col2': ['cde', '345'],
  'col3': ['f', '6']
})

Один способ создать их один за другим, например:

df['col1'] = s.str[:3]
df['col2'] = s.str[3:5]
df['col3'] = s.str[5]

Но ядогадываясь, что это медленнее, чем один сплит.

Я попытался регулярное выражение, но не уверен, как проанализировать результат:

pd.DataFrame(s.str.split("(^(\w{2})(\w{3})(\w{1}))"))
#                          0
# 0 [, abcdef, ab, cde, f, ]
# 1 [, 123456, 12, 345, 6, ]

1 Ответ

0 голосов
/ 20 сентября 2018

Ваше регулярное выражение почти там (примечание Series.str.extract(expand=True) возвращает DataFrame):

df = s.str.extract("^(\w{2})(\w{3})(\w{1})", expand = True)
df.columns = ['col1', 'col2', 'col3']
#   col1    col2    col3
# 0 ab      cde     f
# 1 12      345     6

Вот функция для обобщения этого:

def split_series_by_position(s, ind, cols):
  # Construct regex.
  regex = "^(\w{" + "})(\w{".join(map(str, ind)) + "})"
  df = s.str.extract(regex, expand=True)
  df.columns = cols
  return df

# Example which will produce the result above.
split_series_by_position(s, ind, ['col1', 'col2', 'col3'])
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...