Python Pandas:连接具有唯一值的行

Luk*_*ski 6 python pandas

在 Python pandas 中,我有一个大数据框,如下所示:

df = pd.DataFrame ({'a' : ['foo', 'bar'] * 3,
             'b' : ['foo2', 'bar2'] * 3,
             'c' : ['foo3', 'bar3'] * 3,
             'd' : ['q','w','e','r','t','y'],
             'e' : ['q2','w2','e2','r2','t2','y2']})


     a     b     c  d   e
1  bar  bar2  bar3  w  w2
3  bar  bar2  bar3  r  r2
5  bar  bar2  bar3  y  y2
4  foo  foo2  foo3  t  t2
2  foo  foo2  foo3  e  e2
0  foo  foo2  foo3  q  q2
Run Code Online (Sandbox Code Playgroud)

它包含一打具有重复值(a、b、c...)的列和一些具有唯一值(d、e)的列。我想删除所有重复的值并收集那些唯一的值,即:

     a     b     c  d   e
1  bar  bar2  bar3  w,r,y  w2,r2,y2
4  foo  foo2  foo3  t,e,q  t2,e2,q2
Run Code Online (Sandbox Code Playgroud)

我们可以安全地假设唯一值仅在 'd' 和 'e' 中,而其余的总是重复的。

我可以构思解决方案的一种方法是对所有重复的列进行分组,然后对唯一值应用串联操作:

df.groupby([df.a, df.b, df.c]).apply(lambda x: "{%s}" % ', '.join(x.d))
Run Code Online (Sandbox Code Playgroud)

一个不便之处是如果我想在我的输出中包含所有重复的列,我必须列出所有重复的列。更多的问题是我只连接了 'd' 中的字符串,同时还需要连接 'e'。

有什么建议?

Rom*_*kar 3

我认为你可以这样做:

>>> df.groupby(['a', 'b', 'c']).agg(lambda col: ','.join(col))
                   d         e
a   b    c                    
bar bar2 bar3  w,r,y  w2,r2,y2
foo foo2 foo3  q,e,t  q2,e2,t2
Run Code Online (Sandbox Code Playgroud)

另一种方法是不列出所有列,而只列出具有唯一值的列

>>> gr_columns = [x for x in df.columns if x not in ['d','e']]
>>> df.groupby(gr_columns).agg(lambda col: ','.join(col))
                   d         e
a   b    c                    
bar bar2 bar3  w,r,y  w2,r2,y2
foo foo2 foo3  q,e,t  q2,e2,t2
Run Code Online (Sandbox Code Playgroud)

  • 请注意,`lambda col: ','.join(col)`可以写成`','.join`..但转念一想,我不确定这是否有效,因为我不确定有多严格OP想要“独特”。(也就是说,如果它是“w,w,y”,我们可能必须去掉两个“w”。) (3认同)