Dataframe один ко многим из каждой ячейки столбца в другую

Простой фрейм данных из двух столбцов, в котором я хочу, чтобы содержимое каждого столбца было объединено (или перечислено рядом) друг с другом. Например:

Кажется, есть простой способ, но я не мог вспомнить и восстановить его. Я пробовал «взорвать» и «растопить», но они не работают.

import pandas as pd

data = {'name': ["David","Mike","Kate"], 
'info' : ["Department","Titile","Gender"]}

df = pd.DataFrame(data)

df = df.explode('name')
print (df)

Что еще я могу попробовать?

Должен ли ваш результат соответствовать левому краю изображения или правому?

mhhabib 12.12.2020 08:52

@toRex, результат справа. :)

Mark K 12.12.2020 08:55
Почему в 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 может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
1
2
74
4
Перейти к ответу Данный вопрос помечен как решенный

Ответы 4

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

c1 = [*pd.concat([df['name']]*df.shape[0])]
c2 = [*pd.concat([df['info']]*df.shape[0]).sort_index()]
df = pd.DataFrame(list(zip(c1,c2)), columns=['name', 'info']).sort_values('name').reset_index(drop=True)
df
Out[1]: 
    name        info
0  David  Department
1  David      Titile
2  David      Gender
3   Kate  Department
4   Kate      Titile
5   Kate      Gender
6   Mike  Department
7   Mike      Titile
8   Mike      Gender

Сэмми подал мне идею сделать приведенный выше код немного более кратким:

c1 = pd.concat([df['name']]*df.shape[0], ignore_index=True)
c2 = pd.concat([df['info']]*df.shape[0]).reset_index(drop=True)
df = pd.concat([c1, c2], axis=1)
df

Используйте numpy repeat и numpy tile , чтобы построить свою серию и рекомбинировать с помощью pandas concat:

name = pd.Series(np.repeat(df.name.array, len(df)), name = "name")
info = pd.Series(np.tile(df["info"].array, len(df)), name = "info")
result = pd.concat([name, info], axis = "columns")
result


     name   info
0   David   Department
1   David   Title
2   David   Gender
3   Mike    Department
4   Mike    Title
5   Mike    Gender
6   Kate    Department
7   Kate    Title
8   Kate    Gender

Спасибо. надеюсь, вы не возражаете, что я выберу другой ответ.

Mark K 12.12.2020 09:34

@MarkK, совсем нет. Здоровья, приятель.

sammywemmy 12.12.2020 09:34
Ответ принят как подходящий

Вы можете выполнить перекрестное соединение двух столбцов, используя df.merge, создав столбец tmp:

In [429]: df1 = pd.DataFrame(df.name, columns=['name'])   
In [430]: df2 = pd.DataFrame(df['info'], columns=['info'])

In [433]: df1['tmp'] = 1
In [435]: df2['tmp'] = 1

In [438]: res = pd.merge(df1, df2, on=['tmp']).drop('tmp', 1)

In [439]: res
Out[439]: 
    name        info
0  David  Department
1  David      Titile
2  David      Gender
3   Mike  Department
4   Mike      Titile
5   Mike      Gender
6   Kate  Department
7   Kate      Titile
8   Kate      Gender

Или это можно рассмотреть с точки зрения списка, используя детский язык программирования:

import pandas as pd

data = {'name': ["David","Mike","Kate"], 
'info' : ["Department","Titile","Gender"]}

df = pd.DataFrame(data)

names = df['name'].tolist() 
all_info = df['info'].tolist()

for n in names:
    for a in all_info:
        print (n, a)

Выход:

David Department
David Titile
David Gender
Mike Department
Mike Titile
Mike Gender
Kate Department
Kate Titile
Kate Gender

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