【问题标题】:Combine data on single input在单个输入上合并数据
【发布时间】:2012-10-02 06:56:47
【问题描述】:

我正在处理一些数据存储。但是经过预处理后,数据是这样的,例如:

-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|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: 通过使用 Panda,正如下面的 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

但是,是否有任何不使用任何第三方库的快速方法?

【问题讨论】:

  • 你希望它如何合并?你能发布预期的输出吗??
  • 对不起,我忘了。我已经更新了预期的输出。谢谢!

标签: python data-processing


【解决方案1】:

您可以将数据加载到pandasDataFrame并进行处理。

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

【讨论】:

  • 你能不能也发布输出,以及加载数据的过程,这看起来很棒......
  • 好卡兰巴!一个很好的答案!为此给了你+1。如果可以的话,我会再给你一个使用 IPython 的 +1!
  • 来自pandas 的不错的一个,但为什么它没有在框架上映射TITLE 列?
  • 我已经在顶帖中使用pandas 更新了解决方案,但是,是否有任何不使用第三方库的演练?
  • @xjaphx -- 您可能可以使用 csv 模块和 dict 以及 sqlite3 来做一些事情,但我认为这需要更大的努力。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2022-11-03
  • 2021-10-29
  • 1970-01-01
  • 2012-07-23
  • 1970-01-01
  • 1970-01-01
  • 2016-01-18
相关资源
最近更新 更多