当元素属于多个类别时按类别分组
Group by category when elements belong to multiple categories
我有一个由一组邮政编码索引的数据集合。我想根据与另一组地理特征的接近程度来汇总这些数据,比方说,到附近湖泊的距离。
这很简单,比如说,循环遍历一个数据框中的每个湖泊,并将半正弦函数应用于 return 50 英里内的所有邮政编码。或相反亦然;我可以轻松地遍历所有邮政编码和 return 为每个在所述邮政编码 50 英里范围内的湖泊列表。
但我想更有效地做到这一点。如果每个 zip 只对应一个湖,比如最近的湖,那么简单的方法是创建一个新的 "lake"
列,然后应用 groupby("lake")
接收分箱数据进行处理。
我想要的是一种在分组依据之前自动复制行的技术。假设我有以下数据:
lake
zip
10001 Huron
10002 Huron, Erie
10003 Erie, Superior
我想给 groupby
打电话给 return 以下内容:
group 'Huron'
zip
10001
10002
group 'Erie'
zip
10002
10003
group 'Superior'
zip
10003
基本上,有什么好的方法可以做到这一点,或者您是否基本上坚持使用肮脏的循环索引方法?
选项 1
str.split
与 expand=True
,然后是 stack
+ groupby
。这 return 组。
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
,我的首选方法。这不会 return 您的分组结果,但 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]
我有一个由一组邮政编码索引的数据集合。我想根据与另一组地理特征的接近程度来汇总这些数据,比方说,到附近湖泊的距离。
这很简单,比如说,循环遍历一个数据框中的每个湖泊,并将半正弦函数应用于 return 50 英里内的所有邮政编码。或相反亦然;我可以轻松地遍历所有邮政编码和 return 为每个在所述邮政编码 50 英里范围内的湖泊列表。
但我想更有效地做到这一点。如果每个 zip 只对应一个湖,比如最近的湖,那么简单的方法是创建一个新的 "lake"
列,然后应用 groupby("lake")
接收分箱数据进行处理。
我想要的是一种在分组依据之前自动复制行的技术。假设我有以下数据:
lake
zip
10001 Huron
10002 Huron, Erie
10003 Erie, Superior
我想给 groupby
打电话给 return 以下内容:
group 'Huron'
zip
10001
10002
group 'Erie'
zip
10002
10003
group 'Superior'
zip
10003
基本上,有什么好的方法可以做到这一点,或者您是否基本上坚持使用肮脏的循环索引方法?
选项 1
str.split
与 expand=True
,然后是 stack
+ groupby
。这 return 组。
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
,我的首选方法。这不会 return 您的分组结果,但 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]