元素属于多个类别时按类别分组

时间:2017-10-23 21:56:04

标签: python pandas pandas-groupby

我有一组由一组邮政编码索引的数据。我想根据与另一组地理特征的接近程度来汇总这些数据,比如说,到附近湖泊的距离。

它足够简单,比如说,在一个数据帧中循环遍历每个湖泊,并应用一个半字函数来返回50英里内的所有邮政编码。或相反亦然;我可以轻松遍历所有邮政编码,并返回每个邮政编码50英里范围内的湖泊列表。

但我想更高效地做到这一点。如果每个邮政编号仅对应一个湖泊,比如说最接近,那么执行此操作的简单方法是创建新的"lake"列,然后应用groupby("lake")来接收已装箱的数据以进行处理。

我想要的是一种在group by之前自动复制行的技术。说我有以下数据:

        lake
zip
10001   Huron
10002   Huron, Erie
10003   Erie, Superior

我想致电groupby返回以下内容:

group 'Huron'
zip
10001
10002

group 'Erie'
zip
10002
10003

group 'Superior'
zip
10003

基本上,有没有什么好方法可以做到这一点,或者你是否坚持使用脏循环索引方法?

1 个答案:

答案 0 :(得分:2)

选项1
str.split expand=Truestack + groupby。这会返回组。

g = df.lake.str.split(',\s*', expand=True).stack()\
           .to_frame(name='lake').reset_index(level=1, drop=1).groupby('lake')

for i, k in g:
    print(k, '\n')

       lake
zip        
10002  Erie
10003  Erie 

        lake
zip         
10001  Huron
10002  Huron 

           lake
zip            
10003  Superior 

选项2
str.get_dummies,我的首选方法。这不会将您的结果返回到组中,但get_dummies会隐式创建可以转换为分组的OHE。

g = df.lake.str.get_dummies(sep=r', ')

for c in g.columns:
     print('{}: {}'.format(c, g[c][g[c] > 0].index.tolist()))

Erie: [10002, 10003]
Huron: [10001, 10002]
Superior: [10003]