2016-01-20 2 views
1

У меня есть такая проблема.PANDAS объединяет содержимое нескольких ячеек по индексу

скажем, у меня есть csv. файл как этот

  place X_UTM  Y_UTM   Value_measured 
0   A 686439.00 5231330.00    x 
1   A 686439.00 5231330.00    y 
2   A 686439.00 5231330.00    z 
3   A 686439.00 5231330.00    k 
4   A 686439.00 5231330.00    j 
5   B 790277.00 5192864.00    x' 
6   B 790277.00 5192864.00    y' 
7   B 790277.00 5192864.00    z' 
8   B 790277.00 5192864.00    k' 
9   B 790277.00 5192864.00    j' 
10   C 600163.00 5204188.00    x" 
11   C 600163.00 5204188.00    y" 

где столбцы place и Value_measured содержат строковые значения.

используя следующие строки:

>>test_set_index= place.set_index(['place', 'X_UTM','Y_UTM','Value_measured']) 
>>test_set_index 

выход:

  place X_UTM  Y_UTM   Value_measured 
0   A 686439.00 5231330.00    x 
                y 
                z 
                k 
                j 
5   B 790277.00 5192864.00    x' 
                y' 
                z' 
                k' 
                j' 
10   C 600163.00 5204188.00    x" 
                y" 

, что я хотел бы иметь что-то вроде этого:

  place X_UTM  Y_UTM   Value_measured 
0   A 686439.00 5231330.00   x,y,z,k,j 
5   B 790277.00 5192864.00   x',y',z',k',j'    
10   C 600163.00 5204188.00   x",y" 

Я хотел бы объединить все значения в Value_measured col относительно места и координат.

Я пробовал много подходов, но я не смог найти что-то действительно работающее. Надеюсь, я поняла.

Есть ли у вас какие-либо предложения? Заранее спасибо

ответ

0

pivot_table?

In [60]: df.pivot_table(index=['place', 'X_UTM', 'Y_UTM'], aggfunc=lambda x: ','.join(x)) 
Out[60]: 
          Value_measured 
place X_UTM Y_UTM 
A  686439 5231330   x,y,z,k,j 
B  790277 5192864 'x','y','z','k','j' 
C  600163 5204188    'x','y' 
+0

Я думаю, что это тоже работает. короткий и быстрый! благодаря –

0

Использование groupby с apply функция join. Последнее вы можете reset_index:

place X_UTM Y_UTM Value_measured 
0  A 686439 5231330    x 
1  A 686439 5231330    y 
2  A 686439 5231330    z 
3  A 686439 5231330    k 
4  A 686439 5231330    j 
5  B 790277 5192864   'x' 
6  B 790277 5192864   'y' 
7  B 790277 5192864   'z' 
8  B 790277 5192864   'k' 
9  B 790277 5192864   'j' 
10  C 600163 5204188   'x' 
11  C 600163 5204188   'y 
print df.groupby(['place','X_UTM','Y_UTM'])['Value_measured'].apply(",".join).reset_index() 

    place X_UTM Y_UTM  Value_measured 
0  A 686439 5231330   x,y,z,k,j 
1  B 790277 5192864 'x','y','z','k','j' 
2  C 600163 5204188    'x','y' 

Если вы установили индекс из столбцов place, X_UTM, Y_UTM:

     Value_measured 
place X_UTM Y_UTM     
A  686439 5231330    x 
      5231330    y 
      5231330    z 
      5231330    k 
      5231330    j 
B  790277 5192864   'x' 
      5192864   'y' 
      5192864   'z' 
      5192864   'k' 
      5192864   'j' 
C  600163 5204188   'x' 
      5204188   'y' 

использование level в groupby:

print df.groupby(level=[0,1,2])['Value_measured'].apply(",".join).reset_index() 

    place X_UTM Y_UTM  Value_measured 
0  A 686439 5231330   x,y,z,k,j 
1  B 790277 5192864 'x','y','z','k','j' 
2  C 600163 5204188    'x','y' 
+0

Спасибо за ваш быстрый ответ, он работает очень хорошо !!! –

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