У меня есть DataFrame как
Locality money
1 3
1 4
1 10
1 12
1 15
2 16
2 18
Мне нужно сделать комбинацию с заменой денежного столбца с групповым представлением на местности и фильтр на разницу денег. Цель должна быть такой, как
Locality money1 money2
1 3 3
1 3 4
1 4 4
1 10 10
1 10 12
1 10 15
1 12 12
1 12 15
1 15 15
2 16 16
2 16 18
2 18 18
Обратите внимание, что комбинация применяется для значений в той же местности и значений, которые имеют разницу меньше 6.
Мой текущий код
from itertools import combinations_with_replacement
import numpy as np
import panda as pd
def generate_graph(input_series, out_cols):
return pd.DataFrame(list(combinations_with_replacement(input_series, r=2)), columns=out_cols)
df = (
df.groupby(['Locality'])['money'].apply(
lambda x: generate_graph(x, out_cols=['money1', 'money2'])
).reset_index().drop(columns=['level_1'], errors='ignore')
)
# Ensure the Distance between money is within the permissible limit
df = df.loc[(
df['money2'] - df['money1'] < 6
)]
Проблема в том, что у меня есть DataFrame с 100000 строками, что занимает почти 33 секунд для обработки моего кода. Мне нужно оптимизировать время, затрачиваемое моим кодом, вероятно, используя numpy. Я ищу для оптимизации группового и пост-фильтра, который занимает дополнительное пространство и время. Для демонстрационных данных вы можете использовать этот код для генерации DataFrame.
# Generate dummy data
t1 = list(range(0, 100000))
b = np.random.randint(100, 10000, 100000)
a = (b/100).astype(int)
df = pd.DataFrame({'Locality': a, 'money': t1})
df = df.sort_values(by=['Locality', 'money'])