У меня есть следующий фрейм данных с уникальным 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
Не уверен, зачем вам нужны пустые столбцы после, но вы всегда можете добавить их повторно
Я получил результат путем сложения и слияния с исходным 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
Хорошая мысль о других столбцах, они мне на самом деле не нужны. Я подумал, что это может сделать пример более понятным!
Делать это с помощью 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('')
Спасибо, мне не нужно было сохранять столбцы - я просто подумал, что это может подчеркнуть то, что мне нужно, чтобы конечный результат был, но похоже, что это только добавило путаницы! Ваш ответ идеален, спасибо!
Есть несколько способов сделать это. Сначала настройте:
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
Зачем сохранять другие столбцы, если они больше не используются?