【问题标题】:Groupby and append lists and stringsGroupby 和追加列表和字符串
【发布时间】:2019-03-01 12:07:00
【问题描述】:

我正在尝试对“value_1”列中的值进行分组。但我的最后一列是由列表组成的。当我尝试使用“value_1”列进行分组时,由列表组成的列消失了。

数据框:

 value_1:        value_2:           value_3:               list: 
 american     california, nyc      walmart, kmart      [supermarket, connivence] 
 canadian         toronto            dunkinDonuts      [coffee]
 american          texas                               [state]
 canadian                             walmart          [supermarket] 
   ...              ...                 ...              ....

我的预期输出是:

value_1:        value_2:              value_3:             list: 
american   california, nyc, texas   walmart, kmart      [supermarket, connivence, state] 
canadian         toronto         dunkinDonuts, walmart  [coffee, supermarket]

谢谢!

【问题讨论】:

    标签: python pandas


    【解决方案1】:

    您可以groupby value_1 并使用以下函数聚合包含字符串的列:

    def str_cat(x):
        return x.str.cat(sep=', ')
    

    并使用GroupBy.sum 将列表追加到list 列中:

    df.replace('',None).groupby('value_1').agg({'list':'sum', 'value_2': str_cat,
                                                'value_3': str_cat})
    
                            list                       value_2  \
    value_1                                                              
    american  [supermarket, connivence, state]  california, nyc, texas   
    canadian             [coffee, sipermarket]          toronto, texas   
    
                        value_3  
    value_1                                 
    american  walmart, kmart, dunkinDonuts  
    canadian         dunkinDonuts, walmart  
    

    【讨论】:

      【解决方案2】:

      通过没有listvalue_1 的所有列动态创建字典,对于list 使用带有扁平化列表理解的lambda 函数:

      f1 = lambda x: ', '.join(x.dropna())
      #alternative for join only strings
      #f1 = lambda x: ', '.join([y for y in x if isinstance(y, str)])
      f2 = lambda x: [z for y in x for z in y]
      d = dict.fromkeys(df.columns.difference(['value_1','list']), f1)
      d['list'] = f2 
      
      df = df.groupby('value_1', as_index=False).agg(d)
      print (df)
           value_1                 value_2                value_3  \
      0   american  california, nyc, texas         walmart, kmart   
      1   canadian                 toronto  dunkinDonuts, walmart   
      
                                     list  
      0  [supermarket, connivence, state]  
      1             [coffee, supermarket]  
      

      解释

      f1f2 是 lambda 函数。

      首先删除缺失值(如果存在)和join带分隔符的字符串:

      f1 = lambda x: ', '.join(x.dropna())
      

      首先只获取字符串值(省略缺失值,因为NaNs)和join带分隔符的字符串:

      f1 = lambda x: ', '.join([y for y in x if isinstance(y, str)])
      

      首先通过过滤空字符串和join带分隔符的字符串获取所有字符串值:

      f1 = lambda x: ', '.join([y for y in x if y != '']) 
      

      函数f2 用于flatten lists,因为聚合后会得到像[['a','b'], ['c']] 这样的嵌套列表

      f2 = lambda x: [z for y in x for z in y]
      

      【讨论】:

        猜你喜欢
        • 2022-04-06
        • 2020-09-03
        • 2012-10-14
        • 2020-01-15
        • 2014-03-07
        • 2014-10-04
        • 1970-01-01
        • 2019-09-05
        • 2022-11-02
        相关资源
        最近更新 更多