根据Regions,Python分组不同的地址

时间:2014-02-22 09:20:02

标签: python sorting group-by pandas dataframe

我在SO上搜索了这类问题,但它们有所不同,无法帮助我得出结论。我有一个包含2列的数据框,“Area”和“Address”。在1000个观测中,有322个独特区域。

我的目标是实际存储与一个区域对应的所有地址字。我尝试过使用dict等,但后来这些都变得太复杂了。熊猫必须有一些简单的东西 这是我的数据:

Sr.no     Area                Address
  1      vasanth nagar        cant railway station
  2      mahadevapura         akme ballet d1001 outer ring road
  3      whitefield           villa no 106/107 palm medose 
  4      whitefield           fortune hotel,room 4112 opposite sap labs,
  5      vasanth nagar        station cantonment

我想要的是将所有与whitefield一起出现的单词组合在一起,例如“别墅,不,手掌,财富,酒店,闷热实验室等等”等等。我更喜欢它是一种列表格式,但由于我现在无处可去,任何类型的分组都会将属于每个独特区域的所有地址分配到一起。 Plz注意到我有数以千计的观察结果,因此它不应该是硬编码的 最后,我自己做了什么?这就是一切:

area_ref = data['Area'].sort_index()
area_ref2=set(area_ref)
from collections import defaultdict

grouped = defaultdict(list)
for row in data:
    grouped[row['Area']].append(row['Address'])
        #dint work . error that index should be int , not string.

subset = data[['Area','Address']]
tuples1 = [tuple(x) for x in subset.values]
from collections import defaultdict
res = defaultdict(list)
for v, k in tuples1: res[k].append(v)
di2=[{'type':k, 'items':v} for k,v in res.items()] 
#this last one gave me a really bad dictionary.

这应该不复杂。有一些更好的方法。它会是什么?

2 个答案:

答案 0 :(得分:4)

import pandas as pd
def collect_to_set(grp):                               # 3
    return set.union(*[set(row.split()) for row in grp['Address']])

data = pd.read_table('data', sep='\s{2,}')             # 1
result = data.groupby(['Area']).apply(collect_to_set)  # 2
print(result)                                          # 4
# Area
# mahadevapura         set([ballet, outer, road, ring, d1001, akme])
# vasanth nagar            set([cant, station, railway, cantonment])
# whitefield       set([hotel,room, sap, fortune, villa, no, oppo...
# dtype: object

print(result.to_dict())                                # 5
# {'vasanth nagar': set(['cant', 'station', 'railway', 'cantonment']),
# 'mahadevapura': set(['ballet', 'outer', 'road', 'ring', 'd1001', 'akme']),
# 'whitefield': set(['hotel,room', 'sap', 'fortune', 'villa', 'no', 'opposite',
# 'palm', 'labs,', '4112', 'medose', '106/107'])}
  1. 我使用read_table将您的数据片段加载到DataFrame中。 由于您已将data作为DataFrame,因此您当然不会 需要这条线。
  2. 这是主线。它按dataArea进行分组,然后调用 每个组的collect_to_set函数grp
  3. collect_to_set中,grpdata的子数据框(包含所有内容) 行具有相同的Area)。它返回所有单词的setgrp['Address']
  4. resultSeries
  5. 如果你想要一个字典,请使用result.to_dict()

答案 1 :(得分:0)

制作你的参赛作品的元组。如下图所示。并运行已排序的方法。

d=(('vasanth nagar','cant railway station'),
('mahadevapura','akme ballet d1001 outer ring road'),
('whitefield','villa no 106/107 palm medose '),
('whitefield','fortune hotel,room 4112 opposite sap labs,'),
('vasanth nagar','station cantonment'))

for i in sorted(d):
    print i[0],"     ",i[1]