Простой фрейм данных из двух столбцов, в котором я хочу, чтобы содержимое каждого столбца было объединено (или перечислено рядом) друг с другом. Например:
Кажется, есть простой способ, но я не мог вспомнить и восстановить его. Я пробовал «взорвать» и «растопить», но они не работают.
import pandas as pd
data = {'name': ["David","Mike","Kate"],
'info' : ["Department","Titile","Gender"]}
df = pd.DataFrame(data)
df = df.explode('name')
print (df)
Что еще я могу попробовать?
@toRex, результат справа. :)
Вы можете создать два новых списка, которые умножают значения на общее количество строк. Один столбец должен иметь отсортированный индекс. Затем присоединитесь к спискам в фрейме данных.
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
Спасибо. надеюсь, вы не возражаете, что я выберу другой ответ.
@MarkK, совсем нет. Здоровья, приятель.
Вы можете выполнить перекрестное соединение двух столбцов, используя 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
Должен ли ваш результат соответствовать левому краю изображения или правому?