免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 5870 | 回复: 5
打印 上一主题 下一主题

python模拟数据库group by count怎么写? [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2013-12-21 16:48 |只看该作者 |倒序浏览
有一个文件内容是这样的:
A 1
A 1
A 2
B 2
C 2
D 3
E 4
F 1
G 1
我想让这个文本进行group by count最后的结果生成这样:
A 3 2 1 0 0
B 1 0 1 0 0
C 1 0 1 0 0
D 1 0 0 1 0
E 1 0 0 0 1
F 1 1 0 0 0
G 1 1 0 0 0

第一列是序号人名,第二列是总共出现的次数,第三列是当原始文件第二列等于1的总次数,第四列是当原始文件第二列等于2的总次数,总共只有4中类型

论坛徽章:
0
2 [报告]
发表于 2013-12-21 23:33 |只看该作者
可以用pandas

论坛徽章:
13
双鱼座
日期:2013-10-23 09:30:05数据库技术版块每日发帖之星
日期:2016-04-20 06:20:00程序设计版块每日发帖之星
日期:2016-03-09 06:20:002015亚冠之塔什干火车头
日期:2015-11-02 10:07:452015亚冠之德黑兰石油
日期:2015-08-30 10:07:07数据库技术版块每日发帖之星
日期:2015-08-28 06:20:00数据库技术版块每日发帖之星
日期:2015-08-05 06:20:002015年迎新春徽章
日期:2015-03-04 09:57:09辰龙
日期:2014-12-03 14:45:52酉鸡
日期:2014-07-23 09:46:23亥猪
日期:2014-03-13 08:46:22金牛座
日期:2014-02-11 09:36:21
3 [报告]
发表于 2013-12-22 10:08 |只看该作者
最后一列是啥,你readline然后用dict去统计呗

论坛徽章:
11
技术图书徽章
日期:2014-03-01 14:44:34天蝎座
日期:2014-05-21 22:11:59金牛座
日期:2014-05-30 17:06:14
4 [报告]
发表于 2013-12-22 15:10 |只看该作者
回复 1# 搁浅的思恋
  1. Python 2.7.5 (default, May 15 2013, 22:43:36) [MSC v.1500 32 bit (Intel)] on win32
  2. Type "copyright", "credits" or "license()" for more information.
  3. >>> some_file = '''
  4. A 1
  5. A 1
  6. A 2
  7. B 2
  8. C 2
  9. D 3
  10. E 4
  11. F 1
  12. G 1'''
  13. >>> from cStringIO import StringIO
  14. >>> from itertools import groupby
  15. >>> from collections import Counter
  16. >>> records = []
  17. >>> for line in StringIO(some_file):
  18.         fields = line.strip().split()
  19.         if len(fields) != 2:
  20.                 continue
  21.         records.append([fields[0], int(fields[1], 10)])

  22.        
  23. >>> records.sort(key=lambda v: (v[0], v[1])) #如果第一二列有序,省略之
  24. >>> for k1, g1 in groupby(records, key=lambda v: v[0]):
  25.         cnt = Counter({k2: sum(1 for _ in g2)
  26.                        for k2, g2 in groupby(g1, key=lambda v: v[1])})
  27.         v1, v2, v3, v4 = cnt[1], cnt[2], cnt[3], cnt[4]
  28.         print k1, v1 + v2 + v3 + v4, v1, v2, v3, v4

  29.        
  30. A 3 2 1 0 0
  31. B 1 0 1 0 0
  32. C 1 0 1 0 0
  33. D 1 0 0 1 0
  34. E 1 0 0 0 1
  35. F 1 1 0 0 0
  36. G 1 1 0 0 0
  37. >>>  
复制代码

论坛徽章:
4
白羊座
日期:2013-11-05 10:26:09冥斗士
日期:2015-11-17 14:19:55白银圣斗士
日期:2015-11-17 15:13:0815-16赛季CBA联赛之新疆
日期:2016-04-01 09:10:58
5 [报告]
发表于 2013-12-22 16:11 |只看该作者
回复 1# 搁浅的思恋


    感觉像是大量数据分析过程中的需求。
  1. #-------------------------------------------------------------------------------
  2. # To count the data:
  3. #    Top level Data Structure: Dict: name as key, freq info as value
  4. #    Freq info Data Structure: Dict: data key, frequency value
  5. #        further freq: since 0 will not appear as key, treat is as total freq
  6. #-------------------------------------------------------------------------------

  7. import os
  8. import collections

  9. def count_freq(filename):
  10.     '''Cound name and data frequency.'''
  11.     # pre-check info
  12.     if os.path.isfile(filename) == False:
  13.         return None

  14.     # Open files.
  15.     file_handle = open(filename)
  16.     result = collections.defaultdict(dict)
  17.     try:
  18.         # Based on data, summary data into dict
  19.         for line in file_handle.readlines():
  20.             key, value = line.split()
  21.             # split value is the key for freq-count of this entity
  22.             freq_dict = result[key]
  23.             freq_dict[0] = freq_dict.get(0, 0) + 1
  24.             freq_dict[value] = freq_dict.get(value, 0) + 1
  25.     finally:
  26.         file_handle.close()
  27.         return result

  28. def main():
  29.     import pprint
  30.     result = count_freq('freq_data.txt')
  31.     for key, value in result.iteritems():
  32.         print('{name}\t{total}\t{col1}\t{col2}'.format(
  33.             name = key,
  34.             total = result[key][0],
  35.             col1 = result[key].get('1', 0),
  36.             col2 = result[key].get('2', 0)))
复制代码

论坛徽章:
11
技术图书徽章
日期:2014-03-01 14:44:34天蝎座
日期:2014-05-21 22:11:59金牛座
日期:2014-05-30 17:06:14
6 [报告]
发表于 2013-12-22 16:42 |只看该作者
如果文件第一二列有序,不论文件多大,可以渐进遍历同时计数输出,时间和空间复杂度可以控制得很好:

  1. >>> from cStringIO import StringIO
  2. >>> from itertools import groupby
  3. >>> from collections import Counter
  4. >>> some_file = '''
  5. A 1
  6. A 1
  7. A 2
  8. B 2
  9. C 2
  10. D 3
  11. E 4
  12. F 1
  13. G 1'''
  14. >>> def get_record(fobj):
  15.         for line in fobj:
  16.                 fields = line.strip().split()
  17.                 if len(fields) != 2: continue
  18.                 yield fields[0], int(fields[1], 10)

  19. >>> for k1, g1 in groupby(get_record(StringIO(some_file)), key=lambda v: v[0]):
  20.         cnt = Counter({k2: sum(1 for _ in g2) for k2, g2 in groupby(g1, key=lambda v: v[1])})
  21.         v1, v2, v3, v4 = cnt[1], cnt[2], cnt[3], cnt[4]
  22.         print k1, v1 + v2 + v3 + v4, v1, v2, v3, v4


复制代码
如果文件第一二列无序,文件很大(内存不够),或者用sort等支持外部排序的工具排序,或者就是分割文件统计然后合并。。。

如果文件不大(内存足够),不论文件第一二列是否有序,用我最开始的办法,或dict嵌套dict统计,影响不大。

您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP