Преобразование строк в столбцы и прямое заполнение первого столбца

У меня есть следующий фрейм данных с уникальным URL-адресом в первом столбце, за которым следует случайное количество уникальных ключевых слов. Я хотел бы перенести ключевые слова в одну строку и заполнить URL-адрес в соответствии с моим желаемым результатом ниже.

0                              1          2          3          4          5      
www.example.com/page1         car        dog        cat        bat        apple
www.example.com/page2         dog        car 
www.example.com/page3         cat        bat        apple

Желаемый результат:

0                              1          2          3          4          5   
www.example.com/page1         car       
www.example.com/page1         dog
www.example.com/page1         cat
www.example.com/page1         bat
www.example.com/page1         apple
www.example.com/page2         dog
www.example.com/page2         car
www.example.com/page3         cat
www.example.com/page3         bat
www.example.com/page3         apple

Что я пробовал: Я просмотрел эти решения, но, похоже, они не работают для меня. Я также проконсультировался с документами на pd.melt, но не смог заставить его работать. (Все еще учусь. Любая помощь приветствуется). Панды создают новые строки дат и пересылают значения столбца заполнения Преобразование строк в столбцы с помощью UNPIVOT

Зачем сохранять другие столбцы, если они больше не используются?

cs95 21.12.2020 00:59
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python.
Некоторые методы, о которых вы не знали, что они существуют в Python.
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
0
1
115
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Не уверен, зачем вам нужны пустые столбцы после, но вы всегда можете добавить их повторно

Я получил результат путем сложения и слияния с исходным df

Df.drop([0], axis=1).stack().droplevel(1).to_frame(name=1).merge(df[[0]], left_index=True, right_index=True, how='right')

Окончательно добавьте другие столбцы df[[2,3,4,5]] = ''

       1                      0 2 3 4 5
0    car  www.example.com/page1
0    dog  www.example.com/page1
0    cat  www.example.com/page1
0    bat  www.example.com/page1
0  apple  www.example.com/page1
1    dog  www.example.com/page2
1    car  www.example.com/page2
2    cat  www.example.com/page3
2    bat  www.example.com/page3
2  apple  www.example.com/page3

Хорошая мысль о других столбцах, они мне на самом деле не нужны. Я подумал, что это может сделать пример более понятным!

Lee Roy 21.12.2020 09:19
Ответ принят как подходящий

Делать это с помощью melt довольно просто.

df = df.melt(id_vars='0', value_vars=df.columns[1:], value_name='1').drop('variable', axis=1).sort_values('0')

Это работает правильно, только если ваши пустые ячейки отображаются как NaN в вашем DataFrame. Из приведенного вами примера видно, что на самом деле это не NaN значения, а скорее пустые строки ''. В этом случае вам сначала нужно заменить их на: df.replace('',np.NaN, inplace=True). В противном случае вы получите строки с пустыми записями в столбце 1.

Я также не уверен, почему вы хотите сохранить пустые столбцы с 1 по 5, потому что, если вам нужно заполнить их позже, вы можете просто создать их, это та же процедура, как если бы вы пытались заполнить/переопределить существующий пустой столбец. Но ради этого вы можете добавить пустые столбцы обратно:

df = pd.concat([df, pd.DataFrame(columns=list('2345'))]).fillna('')

Спасибо, мне не нужно было сохранять столбцы - я просто подумал, что это может подчеркнуть то, что мне нужно, чтобы конечный результат был, но похоже, что это только добавило путаницы! Ваш ответ идеален, спасибо!

Lee Roy 21.12.2020 09:49

Есть несколько способов сделать это. Сначала настройте:

df_orig = pd.DataFrame.from_dict(
{'0': {0: 'www.example.com/page1',
  1: 'www.example.com/page2',
  2: 'www.example.com/page3'},
 '1': {0: 'car', 1: 'dog', 2: 'cat'},
 '2': {0: 'dog', 1: 'car', 2: 'bat'},
 '3': {0: 'cat', 1: None, 2: 'apple'},
 '4': {0: 'bat', 1: None, 2: None},
 '5': {0: 'apple', 1: None, 2: None}}
)

# first way, df.melt:
df = df_orig.melt(id_vars = "0", value_vars=list("12345"), value_name = "1")
df_melt = df.drop(columns = "variable").dropna().sort_values("0", ignore_index=True)

# second way, df.unstack:
df_unstack = df_orig.set_index("0", drop=True).unstack().dropna().reset_index(0, drop=True).to_frame()

Выход:

                       0      1
0  www.example.com/page1    car
1  www.example.com/page1    dog
2  www.example.com/page1    cat
3  www.example.com/page1    bat
4  www.example.com/page1  apple
5  www.example.com/page2    dog
6  www.example.com/page2    car
7  www.example.com/page3    cat
8  www.example.com/page3    bat
9  www.example.com/page3  apple

Другие вопросы по теме