2

私はいくつかのデータストレージの処理に取り組んでいます。ただし、前処理後のデータは次のようになります。例:

-1|news.cnet.com|Technology News - CNET News|-1|-1
-1|news.google.com|Google News|-1|-1
-1|www.bbc.co.uk|BBC News - Home|-1|-1
-1|www.cnn.com|CNN.com|-1|-1
-1|www.news.com.au|News.com.au|-1|-1
1|news.google.com|-1|2|5,156,672
2|www.cnn.com|-1|71|325,362
3|www.news.com.au|-1|569|74,584
4|www.bbc.co.uk|-1|49|442,302
5|news.cnet.com|-1|107|187,705

形式はのようなものINDEX|URL|TITLE|RANK|SLIです。この値-1は、列に特定の値がないことを示します。同じエントリが重複している可能性がありますURL。それらをすべてマージすると、レコードが完成します。

これらのレコードを1つの完全なものにすばやく結合するための巧妙なトリックとヒントはありますか?すべての行を繰り返してループして、重複する行を見つけてマージしたくありません。

編集: 期待される出力は次のようになります:

1|news.google.com|Google News|2|5,156,672
2|www.cnn.com|CNN.com|71|325,362
3|www.news.com.au|News.com.au|569|74,584
4|www.bbc.co.uk|BBC News - Home|49|442,302
5|news.cnet.com|Technology News - CNET News|107|187,705

編集2:以下に示すように、 パンダを使用するrootことで、データ列をマージできます。

from pandas import *

frame = read_csv(r'data.txt', sep='|', names=['index', 'url', 'title', 'rank', 'sli'])
mask = frame['index'].map(lambda x: x > 0)

frame1 = frame[mask].set_index('url')
frame2 = frame[~mask].set_index('url')

frame1.title = frame2.title
frame1.set_index('index')
print frame1

ただし、サードパーティのライブラリを使用せずに簡単に回避する方法はありますか?

4

1 に答える 1

3

パンダ にデータをロードして処理することができますDataFrame

from pandas import *

In [360]: frame=read_csv(r'C:\Python26\test.csv',sep='|', names=['index', 'url', 'title','rank','sli'])

In [361]: print frame
   index              url                        title  rank        sli
0     -1    news.cnet.com  Technology News - CNET News    -1         -1
1     -1  news.google.com                  Google News    -1         -1
2     -1    www.bbc.co.uk              BBC News - Home    -1         -1
3     -1      www.cnn.com                      CNN.com    -1         -1
4     -1  www.news.com.au                  News.com.au    -1         -1
5      1  news.google.com                           -1     2  5,156,672
6      2      www.cnn.com                           -1    71    325,362
7      3  www.news.com.au                           -1   569     74,584
8      4    www.bbc.co.uk                           -1    49    442,302
9      5    news.cnet.com                           -1   107    187,705

In [362]: mask = frame['index'].map(lambda x: x>0)

In [363]: frame = frame[mask]

In [364]: print frame
   index              url title  rank        sli
5      1  news.google.com    -1     2  5,156,672
6      2      www.cnn.com    -1    71    325,362
7      3  www.news.com.au    -1   569     74,584
8      4    www.bbc.co.uk    -1    49    442,302
9      5    news.cnet.com    -1   107    187,705

さらに重複がある場合は、次を使用します。

df.drop_duplicates()

また、ダブリケートを削除した後、index「インデックスを再作成」できることに注意してください。

In [372]: print frame.set_index('index')
                   url title  rank        sli
index                                        
1      news.google.com    -1     2  5,156,672
2          www.cnn.com    -1    71    325,362
3      www.news.com.au    -1   569     74,584
4        www.bbc.co.uk    -1    49    442,302
5        news.cnet.com    -1   107    187,705
于 2012-10-02T06:59:02.963 に答える