分组和追加列表和字符串

时间:2019-03-01 12:07:01

标签: python pandas

我正在尝试按“ 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]

谢谢!

2 个答案:

答案 0 :(得分:5)

您可以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  

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

首先仅获取字符串值(省略丢失的值,因为NaN s)和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]