Python Itertools多列组合
我有这些数据Python Itertools多列组合,python,combinations,product,itertools,Python,Combinations,Product,Itertools,我有这些数据 product color size p1 Red XXL p2 Blue XL p3 L S 我想从以下列中进行组合: p1, Red, XXL p1, Red, XL . . p3, Blue, S 我尝试在一个列表中创建所有列,然后使用itertools.compositions,但结果包含一些不需要的数据,如: p1, p2, p3 OR Red, Blue, XXL OR XXL, XL, S
product color size
p1 Red XXL
p2 Blue XL
p3 L
S
我想从以下列中进行组合:
p1, Red, XXL
p1, Red, XL
.
.
p3, Blue, S
我尝试在一个列表中创建所有列,然后使用itertools.compositions,但结果包含一些不需要的数据,如:
p1, p2, p3
OR
Red, Blue, XXL
OR
XXL, XL, S ....
我也在努力让它充满活力
我试着将列转换成dict,然后使用键作为数据指针,但我不知道如何实现这个逻辑,我对dict的经验太肤浅了
data = dict()
for i in df_columns:
data[i] = df[i].dropna(axis=0)
我读了一篇关于itertools.product的文章,这就是为什么我让dict也使用for循环来使用dict键进行相同的更改
我想我对迪克特的处决让我搞糊涂了,有什么指引吗
编辑:
我成功了
temp = []
for i in df_columns:
temp += [data[i]]
final_df = DataFrame(product(*temp), columns=df_columns)
final_df
我想知道有没有更有效的方法来达到同样的效果
谢谢是的,有一种更有效的方法,使用
itertools.product()
:
输出
('p1', 'Red', 'XXL')
('p1', 'Red', 'XL')
('p1', 'Red', 'L')
('p1', 'Red', 'S')
('p1', 'Blue', 'XXL')
('p1', 'Blue', 'XL')
('p1', 'Blue', 'L')
('p1', 'Blue', 'S')
('p2', 'Red', 'XXL')
('p2', 'Red', 'XL')
('p2', 'Red', 'L')
('p2', 'Red', 'S')
('p2', 'Blue', 'XXL')
('p2', 'Blue', 'XL')
('p2', 'Blue', 'L')
('p2', 'Blue', 'S')
('p3', 'Red', 'XXL')
('p3', 'Red', 'XL')
('p3', 'Red', 'L')
('p3', 'Red', 'S')
('p3', 'Blue', 'XXL')
('p3', 'Blue', 'XL')
('p3', 'Blue', 'L')
('p3', 'Blue', 'S')
我假设您的数据存储在dataframe中(5行x 3列),如下所示 使用列表理解 您希望创建一个数据帧,其中包含以下各项的组合。您可以使用列表理解,然后根据结果创建一个数据帧来完成此操作 下面是如何做到这一点
import pandas as pd
df = pd.DataFrame({'product':['p1','p2','p3',''],
'color':['Red','Blue','',''],
'size':['XXL','XL','L','S']})
outlist = [(i,j,k)
for i in df['product'] if i != ''
for j in df['color'] if j != ''
for k in df['size']]
newdf = pd.DataFrame(data=outlist,columns=['product','color','size'])
print (newdf)
新的数据帧将是:
product color size
0 p1 Red XXL
1 p1 Red XL
2 p1 Red L
3 p1 Red S
4 p1 Blue XXL
5 p1 Blue XL
6 p1 Blue L
7 p1 Blue S
8 p2 Red XXL
9 p2 Red XL
10 p2 Red L
11 p2 Red S
12 p2 Blue XXL
13 p2 Blue XL
14 p2 Blue L
15 p2 Blue S
16 p3 Red XXL
17 p3 Red XL
18 p3 Red L
19 p3 Red S
20 p3 Blue XXL
21 p3 Blue XL
22 p3 Blue L
23 p3 Blue S
使用itertools的产品
另一种方法是使用itertools
您可以这样做:
import pandas as pd
from itertools import product
df = pd.DataFrame({'product':['p1','p2','p3',''],
'color':['Red','Blue','',''],
'size':['XXL','XL','L','S']})
print (df)
new_df = pd.DataFrame(data=list(product(df['product'],
df['color'],
df['size'])),
columns=['product','color','size'])
new_df.drop(new_df[(new_df['product'] == '') | (new_df['color'] == '')].index, inplace = True)
new_df = new_df.reset_index(drop=True)
print (new_df)
请注意,我必须删除具有product='
或size='
的行,因为数据帧具有这些值,我们希望忽略它们
其结果将是:
product color size
0 p1 Red XXL
1 p1 Red XL
2 p1 Red L
3 p1 Red S
4 p1 Blue XXL
5 p1 Blue XL
6 p1 Blue L
7 p1 Blue S
8 p2 Red XXL
9 p2 Red XL
10 p2 Red L
11 p2 Red S
12 p2 Blue XXL
13 p2 Blue XL
14 p2 Blue L
15 p2 Blue S
16 p3 Red XXL
17 p3 Red XL
18 p3 Red L
19 p3 Red S
20 p3 Blue XXL
21 p3 Blue XL
22 p3 Blue L
23 p3 Blue S
谢谢你的帮助,谢谢。
product color size
0 p1 Red XXL
1 p2 Blue XL
2 p3 L
3 S
import pandas as pd
df = pd.DataFrame({'product':['p1','p2','p3',''],
'color':['Red','Blue','',''],
'size':['XXL','XL','L','S']})
outlist = [(i,j,k)
for i in df['product'] if i != ''
for j in df['color'] if j != ''
for k in df['size']]
newdf = pd.DataFrame(data=outlist,columns=['product','color','size'])
print (newdf)
product color size
0 p1 Red XXL
1 p1 Red XL
2 p1 Red L
3 p1 Red S
4 p1 Blue XXL
5 p1 Blue XL
6 p1 Blue L
7 p1 Blue S
8 p2 Red XXL
9 p2 Red XL
10 p2 Red L
11 p2 Red S
12 p2 Blue XXL
13 p2 Blue XL
14 p2 Blue L
15 p2 Blue S
16 p3 Red XXL
17 p3 Red XL
18 p3 Red L
19 p3 Red S
20 p3 Blue XXL
21 p3 Blue XL
22 p3 Blue L
23 p3 Blue S
import pandas as pd
from itertools import product
df = pd.DataFrame({'product':['p1','p2','p3',''],
'color':['Red','Blue','',''],
'size':['XXL','XL','L','S']})
print (df)
new_df = pd.DataFrame(data=list(product(df['product'],
df['color'],
df['size'])),
columns=['product','color','size'])
new_df.drop(new_df[(new_df['product'] == '') | (new_df['color'] == '')].index, inplace = True)
new_df = new_df.reset_index(drop=True)
print (new_df)
product color size
0 p1 Red XXL
1 p1 Red XL
2 p1 Red L
3 p1 Red S
4 p1 Blue XXL
5 p1 Blue XL
6 p1 Blue L
7 p1 Blue S
8 p2 Red XXL
9 p2 Red XL
10 p2 Red L
11 p2 Red S
12 p2 Blue XXL
13 p2 Blue XL
14 p2 Blue L
15 p2 Blue S
16 p3 Red XXL
17 p3 Red XL
18 p3 Red L
19 p3 Red S
20 p3 Blue XXL
21 p3 Blue XL
22 p3 Blue L
23 p3 Blue S