У меня есть что-то вроде следующего фреймворка данных, где у меня есть уникальные комбинации диапазонов адресов улиц и названий улиц.Pandas groupby - применять разные функции к половине записей в каждой группе
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, ель) и (300-400, второй) - Я хочу, чтобы половина записей в каждой группе чтобы получить номер блока, равный средней точке диапазона блока и половину записей, чтобы получить номер блока, равный средней точке диапазона блоков плюс 1 (как разместить его на другой стороне улицы).
Я знаю, что это должно быть сделано с помощью преобразования groupby, но я не могу понять, как это сделать (у меня возникли проблемы с применением функции к keyby key, «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
Любые предложения о том, как я могу сделать это более эффективно? Возможно, с помощью группового преобразования?