2016-01-20 375 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" 

其中列placeValue_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列中的值。

我嘗試了很多方法,但我無法找到真正有用的東西。我希望我很清楚。

你有什麼建議嗎? 在此先感謝

回答

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

使用groupbyapply功能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' 

如果已設置指數從列placeX_UTMY_UTM:在groupby

     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

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

感謝您的快速回復,它的效果非常好! –