【发布时间】:2016-02-09 17:33:23
【问题描述】:
我有类似以下数据框的内容,其中我有街道地址范围和街道名称的非唯一组合。
import pandas as pd
df=pd.DataFrame()
df['BlockRange']=['100-150','100-150','100-150','100-150','200-300','200-300','300-400','300-400','300-400']
df['Street']=['Main','Main','Main','Main','Spruce','Spruce','2nd','2nd','2nd']
df
BlockRange Street
0 100-150 Main
1 100-150 Main
2 100-150 Main
3 100-150 Main
4 200-300 Spruce
5 200-300 Spruce
6 300-400 2nd
7 300-400 2nd
8 300-400 2nd
在 3 个“组”中的每一个中 - (100-150, Main)、(200-300, Spruce) 和 (300-400, 2nd) - 我希望每个组中的一半记录获得一个块number 等于块范围的中点和一半的记录,得到一个等于块范围的中点加 1 的块号(将其放在街道的另一侧)。
我知道这应该可以使用 groupby 转换来完成,但我不知道该怎么做(我无法将函数应用于 groupby 键,'BlockRange')。
我只能通过遍历每个唯一组来获得我正在寻找的结果,这在我的完整数据集上运行时需要一段时间。有关我当前的解决方案和我正在寻找的最终结果,请参见下文:
groups=df.groupby(['BlockRange','Street'])
#Write function that calculates the mid point of the block range
def get_mid(x):
block_nums=[int(y) for y in x.split('-')]
return sum(block_nums)/len(block_nums)
final=pd.DataFrame()
for groupkey,group in groups:
block_mid=get_mid(groupkey[0])
halfway_point=len(group)/2
group['Block']=0
group.iloc[:halfway_point]['Block']=block_mid
group.iloc[halfway_point:]['Block']=block_mid+1
final=final.append(group)
final
BlockRange Street Block
0 100-150 Main 125
1 100-150 Main 125
2 100-150 Main 126
3 100-150 Main 126
4 200-300 Spruce 250
5 200-300 Spruce 251
6 300-400 2nd 350
7 300-400 2nd 351
8 300-400 2nd 351
关于如何更有效地做到这一点有什么建议吗?也许使用 groupby 转换?
【问题讨论】: