Python - запись новой строки на основе значений через запятую в столбце таблицы

1

У меня есть образец данных:

column1 column2 column3     column4                       column5 
  a       b        c       paddy, jimmy, john     [242352, 2351235, 65436324]
  a       z        c       james, jill, jillian   [325134, 63464374568, 43574578654]
  s       t        y       patsy                      [463465573452]

Я хочу отделить "column4" и "column5", разделенные комами. Так что каждый столбец 4 и 5 имеет только одно значение. Остальная часть строки будет повторяться.

Пример результирующего фрейма:

column1 column2 column3  column4     column5 
  a       b        c     paddy      242352
  a       b        c     jimmy      2351235
  a       b        c     john      65436324
  .......

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

  • 1
    Где ваши значения с плавающей запятой? Какие решения вы пробовали конкретно, которые не работают?
Теги:
pandas
dataframe

1 ответ

1
Лучший ответ

Используйте pd.reindex и pd.index.repeat для повторения строк.

Затем используйте str.extractall для извлечения только чисел из col5 и str.split, stack для расширения col4 и col5

# Reindex and repeat cols on len of split and reset index
df1 = df.reindex(df.index.repeat(df['column4'].fillna("").str.split(',').apply(len)))
df1 = df1.drop(['column4','column5'],1)

# Splitting both cols
s = df['column4'].str.split(',', expand=True).stack().reset_index(level=1,drop=True)
s1 = df['column5'].str.extractall('(\d+)').reset_index(level=1,drop=True)[0]

# Now grouping the series and df using cumcount.
df1 = df1.set_index(df1.groupby(df1.index).cumcount(), append=True)
s = s.to_frame('column4').set_index(s.groupby(s.index).cumcount(), append=True)
s1 = s1.to_frame('column5').set_index(s1.groupby(s1.index).cumcount(), append=True)

# Joining the all of them together and reset index.
df1 = df1.join(s, how='outer').join(s1,how='outer').reset_index(level=[0,1],drop=True)

print (df1)

выход:

column1 column2 column3  column4    column5
0   a     b       c       paddy     242352
1   a     b       c       jimmy     2351235
2   a     b       c       john      65436324
3   a     z       c       james     325134
4   a     z       c       jill      63464374568
5   a     z       c       jillian   43574578654
6   s     t       y       patsy     463465573452
  • 0
    @ sg123 В вашем column 4 есть значения NaN? Позвольте мне обновить ответ.
  • 0
    @ sg123 есть :) ...
Показать ещё 3 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню