Как взять всю комбинацию фрейма данных Pandas (выбирая по 2 одновременно) и создать новый фрейм данных с каждой комбинацией в одной строке? - PullRequest
0 голосов
/ 04 июня 2019

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

Ввод df

       A    B
 0    0.5   12
 1    0.7   16
 2    0.9   20
 3    0.11  24


Вывод df
 combination      A     B     A'   B'
   (0,1)        0.5    12   0.7   16
   (0,2)        0.5    12   0.9   20
   .................................
   .................................

Ответы [ 2 ]

4 голосов
/ 04 июня 2019

Метод 1

Создайте столбец искусственного ключа, затем объедините df с собой:

df['key'] = 1

df.merge(df, on='key',suffixes=["", "'"]).reset_index(drop=True).drop('key', axis=1)

       A   B    A'  B'
0   0.50  12  0.50  12
1   0.50  12  0.70  16
2   0.50  12  0.90  20
3   0.50  12  0.11  24
4   0.70  16  0.50  12
5   0.70  16  0.70  16
6   0.70  16  0.90  20
7   0.70  16  0.11  24
8   0.90  20  0.50  12
9   0.90  20  0.70  16
10  0.90  20  0.90  20
11  0.90  20  0.11  24
12  0.11  24  0.50  12
13  0.11  24  0.70  16
14  0.11  24  0.90  20
15  0.11  24  0.11  24

Метод 2

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

idx = [x for x in range(len(df))] * len(df)
idx.sort()
df2 = pd.concat([df]*len(df))
df2.index = idx

df.merge(df2, left_index=True, right_index=True, suffixes=["", "'"]).reset_index(drop=True)

       A   B    A'  B'
0   0.50  12  0.50  12
1   0.50  12  0.70  16
2   0.50  12  0.90  20
3   0.50  12  0.11  24
4   0.70  16  0.50  12
5   0.70  16  0.70  16
6   0.70  16  0.90  20
7   0.70  16  0.11  24
8   0.90  20  0.50  12
9   0.90  20  0.70  16
10  0.90  20  0.90  20
11  0.90  20  0.11  24
12  0.11  24  0.50  12
13  0.11  24  0.70  16
14  0.11  24  0.90  20
15  0.11  24  0.11  24
2 голосов
/ 04 июня 2019

Давайте использовать itertools.combinations:

from itertools import combinations

pd.concat([df.loc[[i,j]]
             .unstack()
             .set_axis(["A","A'","B","B'"], axis=0, inplace=False)
             .to_frame(name=(i,j)).T 
            for i, j in combinations(df.index, 2)])

Выходной фрейм данных с мультииндексом:

       A    A'     B    B'
0 1  0.5  0.70  12.0  16.0
  2  0.5  0.90  12.0  20.0
  3  0.5  0.11  12.0  24.0
1 2  0.7  0.90  16.0  20.0
  3  0.7  0.11  16.0  24.0
2 3  0.9  0.11  20.0  24.0

Или как индекс со строкой

pd.concat([df.loc[[i,j]]
             .unstack()
             .set_axis(["A","A'","B","B'"], axis=0, inplace=False)
             .to_frame(name='('+str(i)+','+ str(j)+')').T 
           for i,j in combinations(df.index,2)]))

Выход:

         A    A'     B    B'
(0,1)  0.5  0.70  12.0  16.0
(0,2)  0.5  0.90  12.0  20.0
(0,3)  0.5  0.11  12.0  24.0
(1,2)  0.7  0.90  16.0  20.0
(1,3)  0.7  0.11  16.0  24.0
(2,3)  0.9  0.11  20.0  24.0
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...