2014-11-27 3 views
1

В панде Python У меня есть большой кадр данных, который выглядит следующим образом:Python Панда: конкатенации строки с уникальными значениями

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 

Он содержит дюжину столбцов с дублированными значениями (а, б, в ...) и несколько с уникальными значениями (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 

Мы можем с уверенностью предположить, что уникальные значения только в «D» и «е», в то время как остальные всегда дублируется.

Один из способов я мог представить себе решение было бы GroupBy все дублированные столбцы, а затем применить операцию конкатенации уникальных значений:

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

Одно неудобство заключается в том, что я должен перечислить все дублированные столбцы, если я хочу имейте их в моей продукции. Большая проблема заключается в том, что я конкатенирую только строки в 'd', а также 'e'.

Любые предложения?

+0

Только в стороне вы не» t нужно передать столбцы в виде столбцов df, чтобы было достаточно: 'df.groupby (['a', 'b', 'c']). apply (lambda x:" {% s} "% ','. join (xd)) ' – EdChum

+0

Спасибо! Причина, по которой я использовал df-нотацию, состояла в том, что изначально эти имена были очень длинными, поэтому я использую механизм автозаполнения. Чтобы избавить других от деталей, я заменил их письмами. –

ответ

2

Я думаю, что вы можете сделать что-то вроде этого:

>>> 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 

Другой способ сделать это, а не список всех столбцов, но только список из них с уникальными значениями

>>> 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 
+3

Обратите внимание, что 'lambda col: ','. Join (col)' может быть записано как '', '. Join' .. но, с другой стороны, я не уверен, что это сработает, потому что я не уверен, как строгий OP хочет быть с «уникальным». (I.e. нам, возможно, придется избавиться от двух 'w', если бы это было 'w, w, y''.) – DSM

+0

Спасибо, отлично поработал! Все значения внутри группы уникальны, поэтому может работать и «.». Join. Спасибо за предложение! –

Смежные вопросы