【问题标题】:Grouping different addresses according to Areas ,Python根据区域分组不同的地址,Python
【发布时间】:2014-03-24 00:31:47
【问题描述】:

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

我的目标是实际存储与一个 Area 对应的所有地址词。我曾尝试使用 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 一起出现的单词进行分组,例如“别墅、不、棕榈、财富、酒店、sap 实验室……等”等等。我希望它采用列表格式,但由于我现在无处可去,任何类型的分组都可以将属于每个唯一区域的所有地址分配到一起。请注意,我有数千个观察结果,因此不应对其进行硬编码。
最后,我自己做了什么??这就是一切:

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.

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

【问题讨论】:

  • 你能根据输入显示预期的结果吗?
  • 我希望将与特定区域相关的所有单词组合在一起。最好是一个列表@XavierCombelle。所以,'cant, train, station ,cantonment...' 属于 Vasanth nagar。

标签: python sorting group-by pandas dataframe


【解决方案1】:
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 将您的数据sn-p 加载到DataFrame 中。 既然你已经有data 作为一个DataFrame,你当然不会 需要这条线。
  2. 这是主线。它将dataArea 分组,然后调用 每个组的collect_to_set 函数grp
  3. collect_to_set 中,grpdata 的子DataFrame(与所有 具有相同Area 的行)。它返回一个 set 的所有单词 grp['Address'] 的行。
  4. resultSeries
  5. 如果您想要一个字典,请使用result.to_dict()

【讨论】:

  • 如果我希望第二列中的单词以列表的形式出现呢?非常感谢.. :)
  • 如果我正确理解你的情况,你不应该想要一个列表。使用集合的优点是它提供了一个唯一词的集合。此外,测试集合中的成员资格是O(1),而测试列表中的成员资格是O(n)。因此,如果您只想知道某些词是否用于描述某个区域,您应该使用set。相反,列表意味着单词的顺序很重要。如果顺序无关紧要,那么list 是数据结构的错误选择。但是,如果您确实想要list,那么只需在collect_to_set 中添加return list(set.union(...))
  • 哦……谢谢兄弟。我从来不知道。我可以将这些集合用作函数的输入吗?
  • 当然。在 Python 中,几乎所有东西都是对象。任何对象都可以用作函数的输入。
  • thanx.. 你让我开心。你总有一天可以加入 Python 聊天组并提供帮助
【解决方案2】:

将您的条目制作成元组。如下所示。并运行排序方法。

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]

【讨论】:

  • 我有 300 万个地址需要清除;)。我在 1000 个样本上运行它。我刚刚在这里发布了 5 个。正如我在问题中所说,我买不起硬代码。
猜你喜欢
  • 1970-01-01
  • 2019-11-26
  • 2013-07-02
  • 1970-01-01
  • 2023-04-08
  • 2013-07-18
  • 2021-11-05
  • 1970-01-01
  • 2014-08-06
相关资源
最近更新 更多