У меня есть датафрейм, как показано ниже,

df=pd.DataFrame({'col1':[1,2,3,4,5],'col2':list('abcde')})

Я хочу сделать дубликат dataframe по длине его содержимого.

По сути, я хочу, чтобы каждое значение в col1 добавлялось со всем содержимым col2.

Вход:

   col1 col2
0     1    a
1     2    b
2     3    c
3     4    d
4     5    e

O / P :

    col1 col2
0      1    a
1      1    b
2      1    c
3      1    d
4      1    e
5      2    a
6      2    b
7      2    c
8      2    d
9      2    e
10     3    a
11     3    b
12     3    c
13     3    d
14     3    e
15     4    a
16     4    b
17     4    c
18     4    d
19     4    e
20     5    a
21     5    b
22     5    c
23     5    d
24     5    e

Для этого я использовал это,

op=[]
for val in df.col1.values:
    temp=df.copy()
    temp['col1']=val
    op.append(temp)
print(pd.concat(op,ignore_index=True))

Я хочу получить точный вывод в лучшую сторону (за исключением цикла)

1
Mohamed Thasin ah 5 Июл 2019 в 10:18

6 ответов

Лучший ответ

С unstack:

pd.DataFrame(index=df.col2,columns=df.col1).unstack().reset_index().drop(0,1)
1
B. M. 5 Июл 2019 в 07:41

Попробуйте itertools, чтобы сделать это

import pandas as pd
from itertools import product

df=pd.DataFrame({'col1':[1,2,3,4,5],'col2':list('abcde')})

res = pd.DataFrame((product(df['col1'],df['col2'])),columns=['col1','col2'])
print(res)
    col1 col2
0      1    a
1      1    b
2      1    c
3      1    d
4      1    e
5      2    a
6      2    b
7      2    c
8      2    d
9      2    e
10     3    a
11     3    b
12     3    c
13     3    d
14     3    e
15     4    a
16     4    b
17     4    c
18     4    d
19     4    e
20     5    a
21     5    b
22     5    c
23     5    d
24     5    e

Я надеюсь, что это решит вашу проблему

1
tawab_shakeel 5 Июл 2019 в 07:26

Там вы идете:

= ^ .. ^ =

import pandas as pd

df=pd.DataFrame({'col1':[1,2,3,4,5],'col2':list('abcde')})

# repeat col1 values
df_col1 = df['col1'].repeat(df.shape[0]).reset_index().drop(['index'], axis=1)
# multiply col2 values
df_col2 = pd.concat([df['col2']]*df.shape[0], ignore_index=True)
# contact results
result = pd.concat([df_col1, df_col2], axis=1, sort=False)

Выход:

    col1 col2
0      1    a
1      1    b
2      1    c
3      1    d
4      1    e
5      2    a
6      2    b
7      2    c
8      2    d
9      2    e
10     3    a
11     3    b
12     3    c
13     3    d
14     3    e
15     4    a
16     4    b
17     4    c
18     4    d
19     4    e
20     5    a
21     5    b
22     5    c
23     5    d
24     5    e
0
Zaraki Kenpachi 5 Июл 2019 в 07:48

Итак, что вы хотите, это декартово произведение. Я бы сделал это так:

from intertools import product
pd.DataFrame(product(*[df.col1.values,df.col2.values]),columns=["col1","col2"])

#output
    0   1
0   1   a
1   1   b
2   1   c
3   1   d
4   1   e
5   2   a
6   2   b
7   2   c
8   2   d
9   2   e
10  3   a
11  3   b
12  3   c
13  3   d
14  3   e
15  4   a
16  4   b
17  4   c
18  4   d
19  4   e
20  5   a
21  5   b
22  5   c
23  5   d
24  5   e

Вам нужно снова ввести название столбцов, ты.

1
Francesco Zambolin 5 Июл 2019 в 07:42

Используйте перекрестное соединение и отфильтруйте необходимые столбцы:

df = pd.merge(df.assign(a=1), df.assign(a=1), on='a')[['col1_x','col2_y']]
df = df.rename(columns = lambda x: x.split('_')[0])
print (df)
    col1 col2
0      1    a
1      1    b
2      1    c
3      1    d
4      1    e
5      2    a
6      2    b
7      2    c
8      2    d
9      2    e
10     3    a
11     3    b
12     3    c
13     3    d
14     3    e
15     4    a
16     4    b
17     4    c
18     4    d
19     4    e
20     5    a
21     5    b
22     5    c
23     5    d
24     5    e
1
jezrael 5 Июл 2019 в 07:32

Ну ... по сути, все, что дает вам декартово произведение, подойдет. Например,

pd.MultiIndex.from_product([df['col1'],df['col2']]).to_frame(index=False, name=['Col1','Col2'])
1
Mark Wang 6 Июл 2019 в 22:42