代码之家  ›  专栏  ›  技术社区  ›  The Great

如何使用熊猫按行进行压缩?

  •  0
  • The Great  · 技术社区  · 3 年前

    我有一个如下所示的数据帧

    ID,Region,Supplier,year,output
    1,ANZ,AB,2021,1
    2,ANZ,ABC,2022,1
    3,ANZ,ABC,2022,1
    4,ANZ,ABE,2021,0
    5,ANZ,ABE,2021,1
    6,ANZ,ABQ,2021,1
    7,ANZ,ABW,2021,1
    8,AUS,ABO,2020,1
    9,KOREA,ABR,2019,0
    

    我正试图产生独特的组合 region supplier 价值观我想用via代替groupby zip_longest .

    所以,我尝试了下面的方法

    for i,j in itertools.zip_longest(region_values,supplier_values,fillvalue="ANZ"):
        print(i,j)
    

    但上述情况会导致错误的输入 i and j .

    我想从特定的行中得到每个独特的组合。我不希望乘法/生成数据中没有的新组合

    目前,这会导致输出错误 如下图所示

    ANZ AB
    AUS ABC  #incorrect to generating new combinations like this
    KOREA ABE #incorrect to generating new combinations like this
    ANZ ABQ
    ANZ ABW
    ANZ ABO
    ANZ ABR
    

    我希望我的输出如下所示

    ANZ AB
    ANZ ABC
    ANZ ABE
    ANZ ABQ
    ANZ ABW
    AUS ABO
    KOREA ABR 
    

    我使用zip_longest,因为在此之后,我想使用zip对象的输出来使用两列过滤数据帧

    2 回复  |  直到 3 年前
        1
  •  1
  •   jezrael    3 年前

    如果排序很重要,则需要同时删除两列的重复项,因此 unique 需要 drop_duplicates :

    column_name = "Region"
    col_name = "Supplier"
    df = data.drop_duplicates([column_name, col_name])    
            
    for i,j in zip(df[column_name],df[col_name]):
        print(i,j)
        ANZ AB
        ANZ ABC
        ANZ ABE
        ANZ ABQ
        ANZ ABW
        AUS ABO
        KOREA ABR
    
        2
  •  1
  •   mozway    3 年前

    看起来你想要一套:

    set(zip(df['Region'], df['Supplier']))
    

    输出:

    {('ANZ', 'AB'),
     ('ANZ', 'ABC'),
     ('ANZ', 'ABE'),
     ('ANZ', 'ABQ'),
     ('ANZ', 'ABW'),
     ('AUS', 'ABO'),
     ('KOREA', 'ABR')}
    

    对于迭代:

    for r, s in set(zip(df['Region'], df['Supplier'])):
        pass
    

    如果订单很重要,那就用吧 dict.from_keys :

    for a,b in dict.fromkeys(zip(df['Region'], df['Supplier'])).keys():
        print(a,b)