Объединение двух строк фрейма данных в одну - PullRequest
0 голосов
/ 17 июня 2020

У меня есть фрейм данных df с 3 столбцами: name, salary и position.

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

from itertools import combinations
import pandas as pd

cc = list(combinations(df.index,2)
df2 = pd.DataFrame([df.loc[c,['name','salary','position']] for c in cc], index=cc)

Я хотел бы, чтобы этот код создавал новый фрейм данных (df2) с шестью столбцами name1, name2, salary1, salary2 , position1 и position2. Каждый столбец будет включать данные соответствующей строки - например, name1 будет содержать значение в name для первой из двух объединяемых строк, а name2 будет содержать значение в name для второй из две строки.

В настоящее время код создает три столбца (name, salary и position), объединяя вместе строки из исходного фрейма данных. Например, значение name первой строки - «JohnSmithJaneDoe». Поскольку все записи имеют разную длину, я не могу просто разделить их на два новых столбца.

EDIT:

Мои данные:

name = ['Barnes', 'Davies', 'Fernandes', 'Freeman', 'Gomes', 'Gray', 'Henderson', 'James', 'Jota', 'Kelly', 'Long', 'McCarthy', 'Pereira', 'Ward', 'Smith']
salary = [51, 48, 52, 69, 46, 83, 123, 78, 71, 63, 61, 48, 65, 49, 62]
position = ['0', '1', '1', '1', '1', '2', '2', '2', '2', '2', '3', '0', '3', '1', '3']

pd.DataFrame({'name':name,'salary':salary,'position':position})

1 Ответ

1 голос
/ 17 июня 2020
import pandas as pd
from itertools import combinations
name = ['Barnes', 'Davies', 'Fernandes', 'Freeman', 'Gomes', 'Gray', 'Henderson', 'James', 'Jota', 'Kelly', 'Long', 'McCarthy', 'Pereira', 'Ward', 'Smith']
salary = [51, 48, 52, 69, 46, 83, 123, 78, 71, 63, 61, 48, 65, 49, 62]
position = ['0', '1', '1', '1', '1', '2', '2', '2', '2', '2', '3', '0', '3', '1', '3']

df=pd.DataFrame({'name':name,'salary':salary,'position':position})
cc=list(combinations(df.index,2))
## create empty df2
df2=pd.DataFrame(columns=['name1','name2','salary1','salary2','position1','position2'])
## generate rows by combination in cc
for ind,i in enumerate(cc):
    l1=df.loc[i[0]]
    l2=df.loc[i[1]]
    temp=[l1['name'],l2['name'],l1['salary'],l2['salary'],l1['position'],l2['position']]
    df2.loc[ind] = temp

print(df2)

Предоставляет фрейм данных примерно так (интервал искажается из-за копирования из записной книжки jupyter):

    name1   name2   salary1 salary2 position1   position2
0   Barnes  Davies  51      48      0           1
1   Barnes  Fernandes   51  52      0           1
2   Barnes  Freeman 51      69      0           1
3   Barnes  Gomes   51      46      0           1
4   Barnes  Gray    51      83      0           2
... ... ... ... ... ... ...
100 McCarthy    Ward    48  49      0           1
101 McCarthy    Smith   48  62      0           3
102 Pereira Ward    65      49      3           1
103 Pereira Smith   65      62      3           3
104 Ward    Smith   49      62      1           3
...