Объединить несколько столбцов в более чем один ряд в пандах

1

У меня есть фреймворк pandas. Я хотел бы объединить несколько столбцов на основе одного столбца с идентификатором. Может быть несколько строк столбцов, которые должны быть объединены. Я работаю только со строками.

Так, например, у меня есть набор данных, который выглядит так:

 Identifier     Op1 Op2 Op3
 A     str_1    str_2   str_3
 B     str_4    str_5   str_6
 B     str_7    str_8   str_9
 B     str_10   str_11  str_12
 C     str_13   str_14  str_15 
 C     str_16   str_17  str_18

Мне нужны все в Op1, Op2 и Op3, конкатенированные. Если один и тот же "идентификатор" находится на более чем одной строке, мне нужны столбцы Op1, Op2 и Op3, которые объединены, а затем объединены с первым столбцом.

Итак, мой конечный результат должен выглядеть следующим образом:

 Identifier Ops
 A  str_1 str_2 str_3
 B  str_4 str_5 str_6 str_7 str_8 str_9 str_10 str_11 str_12
 C  str_13 str_14 str_15 str_16 str_17 str_18

Между каждой "вещью" должно быть пространство. Так что 'str_8 str_9' вместо 'str_8str_9'

У меня также есть эта таблица в sqlite3, если с ней проще работать, чем pandas.

Как это сделать?

Спасибо

Теги:
pandas
dataframe
sqlite3

3 ответа

1
Лучший ответ

Ввод ваших входных данных в файл csv, я сделал следующее, и он работает хорошо.

import pandas as pd

DF = pd.read_csv("CombinerData.csv")

print DF
print 

def combine_Columns_Into_New_Column(DF, columns_To_Combine, new_Column_Name):
    DF[new_Column_Name] = ''
    for Col in columns_To_Combine:
        DF[new_Column_Name] += DF[Col].map(str) + ' '
    DF = DF.drop(columns_To_Combine, axis=1)
    DF = DF.groupby(by=['Identifier']).sum()

    return DF

DF = combine_Columns_Into_New_Column(DF, ['Op1','Op2','Op3'],'Ops')

print DF

ВЫВОД:

                                                          Ops
Identifier                                                   
A                                          str_1 str_2 str_3 
B           str_4 str_5 str_6 str_7 str_8 str_9 str_10 str...
C                 str_13 str_14 str_15  str_16 str_17 str_18 

INPUT FILE:

Identifier,Op1,Op2,Op3
A,str_1,str_2,str_3
B,str_4,str_5,str_6
B,str_7,str_8,str_9
B,str_10,str_11,str_12
C,str_13,str_14,str_15 
C,str_16,str_17,str_18
  • 0
    Это почти работает для меня. Новый DF не добавлен новый столбец, хотя? Как мне это исправить?
  • 0
    @ifthenifthen, я запустил его снова так же, как я опубликовал его, и он работает так же, как я сообщил об этом. Я использую Python 2.7. Дважды проверьте свой код и входной файл. Если вы поместите свой код и данные в какое-нибудь удаленное git-репо, я могу помочь вам устранить неполадки. Я также добавил структуру входного файла в редактировании выше.
Показать ещё 9 комментариев
2

С вашим вводом DataFrame под названием df попробуйте следующее:

from itertools import chain
df.groupby('Identifier')['Op1', 'Op2', 'Op3']\
  .apply(lambda x: ' '.join(list(chain(*x.values.tolist()))))\
  .reset_index()\
  .rename(columns={0:'Ops'})
  • 0
    Я дошел до reset_index (). Затем я получил следующую ошибку: AttributeError: Невозможно получить доступ к вызываемому атрибуту «reset_index» объектов «DataFrameGroupBy», попробуйте использовать метод «apply»
  • 0
    Мне удается повторить эту ошибку, запустив groupby дважды, например, что-то вроде df.groupby(...)[...].groupby(...) , поэтому, возможно, дважды проверьте, что вы этого не делаете. В противном случае код, кажется, работает для меня.
Показать ещё 1 комментарий
1
In [168]: (df.set_index('Identifier')
     ...:    .T
     ...:    .agg(lambda x: x.str.cat(sep=' '))
     ...:    .groupby(level=0)
     ...:    .agg(' '.join)
     ...:    .reset_index(name='Ops'))
     ...:
Out[168]:
  Identifier                                                Ops
0          A                                  str_1 str_2 str_3
1          B  str_4 str_5 str_6 str_7 str_8 str_9 str_10 str...
2          C          str_13 str_14 str_15 str_16 str_17 str_18
  • 0
    Я пытаюсь найти решение - я получил сообщение об ошибке, что у объекта DataFrame нет атрибута agg. Я использую Python 2.7.
  • 0
    @ifthenifthen, он не будет работать, если ваша версия Pandas <0.20.0. Попробуйте обновить Pandas или использовать решение @ ags29

Ещё вопросы

Сообщество Overcoder
Наверх
Меню