Более эффективный способ создания нового столбца в кадре данных, который использует фильтрацию на основе строк, но избегPython

Программы на Python
Anonymous
Более эффективный способ создания нового столбца в кадре данных, который использует фильтрацию на основе строк, но избег

Сообщение Anonymous »

У меня есть упрощенная функция, представленная ниже, но которую я использую для создания нового столбца в существующем фрейме данных. Прямо сейчас я использую iterrows, но я пробовал использовать .apply при фильтрации по уникальным группам «Год» и «Неделя» (нет, их нельзя преобразовать в даты по причинам), но это не сильно ускорило работу. Есть идеи по использованию векторизованных функций для более эффективного выполнения этой задачи?
Примеры версий:
input_df =
| Год | неделя | Компания |
| ---- | ---- | ------- |
| 2024 | 2 | А |
| 2023 | 16 | А |
| 2023 | 12 | B |
historical_df =
| Год | неделя | Компания | Том |
| ---- | ---- | ------- | ------ |
| 2024 | 2 | А | 43 |
| 2023 | 16 | А | 32 |
| 2023 | 12 | Б | 67 |

Код: Выделить всё

def add_variability(input_df, historical_df):
variability_calcs = []

for index, row in input_df.iterrows():
filtered_historical_df = historical_df[
((historical_df['Year'] < row['Year']) |
((historical_df['Year'] == row['Year']) & (historical_df['Week'] < row['Week']))) &
(historical_df['Company'] == row['Company'])
]

filtered_historical_df = filtered_historical_df.sort_values(by=['Year', 'Week'], ascending=False)

recent_weeks = filtered_historical_df.head(16)

if recent_weeks.shape[0] > 1:
if recent_weeks['Volume'].mean() != 0:
cv = recent_weeks['Volume'].std() / recent_weeks['Volume'].mean()
else:
cv = None
else:
cv = None

variability_calcs.append(cv)

input_df['Variability'] = variability_calcs
return input_df
Выход:
input_df =
| Год | неделя | Компания | Изменчивость |
| ---- | ---- | ------- | ----------- |
| 2024 | 2 | А | 0,334 |
| 2023 | 16 | А | 0,242 |
| 2023 | 12 | Б | 0,455 |

Подробнее здесь: https://stackoverflow.com/questions/789 ... ed-filteri

Вернуться в «Python»