如何以有效方式倍增数据帧

时间:2019-07-05 07:18:53

标签: python pandas

我有一个如下数据框,

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

我想按其内容的长度来复制数据框。

基本上我想将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))

我想以更好的方式获得准确的输出(不包括循环)

6 个答案:

答案 0 :(得分:1)

使用交叉联接并过滤必要的列:

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 :(得分:1)

尝试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

我希望它能解决您的问题

答案 2 :(得分:1)

带卸货:

pd.DataFrame(index=df.col2,columns=df.col1).unstack().reset_index().drop(0,1)

答案 3 :(得分:1)

因此,您想要的是笛卡尔乘积。我会这样:

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

您需要再次输入列的名称。

答案 4 :(得分:1)

..基本上,任何可以给您笛卡尔积的东西都可以。例如,

pd.MultiIndex.from_product([df['col1'],df['col2']]).to_frame(index=False, name=['Col1','Col2'])

答案 5 :(得分:0)

去那里:

= ^ .. ^ =

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