У меня есть фреймворк 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.
Как это сделать?
Спасибо
Ввод ваших входных данных в файл 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
С вашим вводом 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'})
df.groupby(...)[...].groupby(...)
, поэтому, возможно, дважды проверьте, что вы этого не делаете. В противном случае код, кажется, работает для меня.
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