【问题标题】:Itertools combinations of multiple columns多列的itertools组合
【发布时间】:2021-01-27 12:05:26
【问题描述】:

我有这个数据

product color size
p1      Red   XXL
p2      Blue  XL
p3            L
              S

我想从列中进行如下组合:

p1, Red, XXL
p1, Red, XL
.
.
p3, Blue, S

我尝试在一个列表中创建所有列,然后使用 itertools.combinations 但结果包含一些不需要的数据,例如:

p1, p2, p3 要么 红色、蓝色、XXL 要么 XXL、XL、S ....

我的代码是:

df = read_csv('./GenerateProducts.csv', delimiter=',')
df_columns = df.columns.tolist()
list_data = DataFrame()
for i in df_columns:
    list_data = concat([list_data,df[i].dropna(axis=0)])
generated_products = DataFrame( combinations( list_data[0] ,len(df_columns) ) )

我也在尝试让它动态化 我试图将列变成 dict 然后使用键作为数据的指针,但我不知道如何实现这个逻辑,我对 dict 的经验太浅了

data = dict()
for i in df_columns:
    data[i] = df[i].dropna(axis=0)

我阅读了关于 itertools.product 的文章,这就是为什么我制作 dict 也使用 for 循环使用 dict 键进行相同的更改。

我认为我对 dict 的执行让我感到困惑,任何指导

编辑:

我已经开始工作了

temp = []
for i in df_columns:
    temp += [data[i]]
    
final_df = DataFrame(product(*temp), columns=df_columns)
final_df

我想知道是否有更有效的方法来完成相同的结果

谢谢

【问题讨论】:

    标签: python combinations product itertools


    【解决方案1】:

    是的,有一种更高效的方法,使用itertools.product()

    import itertools
    
    prod1 = ['p1', 'p2', 'p3']
    color1 = ['Red', 'Blue']
    size1 = ['XXL', 'XL', 'L', 'S']
    t1 = itertools.product(prod1, color1, size1)
    for t in t1:
        print(t)
    

    输出

    ('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')
    

    【讨论】:

      【解决方案2】:

      我假设您的数据在您的数据框中存储如下(5 行 x 3 列)。

        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
      

      使用来自 itertools 的产品

      另一种方法是使用product from 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
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-11-12
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多