У меня есть фрейм данных со значениями разных атрибутов, и у меня есть файл json, в котором есть список атрибутов для суммирования, только если столбец в фрейме данных содержит строку.
| Product | store_location | attr1 | attr2 | attr3 | attr4 | global |
| ------- | -------------- | ----- | ----- | ----- | ----- | ------ |
| First | NY-store1 | 3 | 5 | 2 | 2 | |
| Second | NY-store2 | 1 | 3 | 5 | 1 | |
| Third | NJ-store1 | 3 | 5 | 2 | 2 | |
| Fourth | PA-store1 | 1 | 3 | 5 | 1 | |
Файл json имеет такую структуру:
{
"positionEvaluation": [
{
"position": "Global",
"sumElements": ["attr1", "attr2"],
"gralSum": ["attr2", "attr3", "attr4"],
"elementsProm": ["attr1", "attr2", "attr3", "attr4"]
}
]
}
Очевидно, что реальный файл имеет больше атрибутов, только для демонстрации. Итак, я хочу, чтобы когда продукт находится в магазине, строка «NY» брала соответствующие атрибуты «sumElements» и делила на длину «gralSum», и если у продукта есть другая строка, такая как «NJ» или «PA», просто суммируйте все элементы "elementsProm", а затем разделите на его длину.
Вот мой код:
for p in range(len(js_positions["positionEvaluation"])):
aux1_string = js_positions["positionEvaluation"][p]["position"]
df[aux1_string] = 0
if df['store_location'].str.contains('NY').any():
for k in range(len(js_positions["positionEvaluation"][p]["sumElements"])):
tmp = js_positions["positionEvaluation"][p]["sumElements"][k]
df[aux1_string] = df[aux1_string] + df[tmp_for_gk]
df[aux1_string] = df[aux1_string] / len(js_positions["positionEvaluation"][p]["gralSum"])
else:
for k in range(len(js_positions["positionEvaluation"][p]["elementsProm"])):
tmp = js_positions["positionEvaluation"][p]["elementsProm"][k]
df[aux1_string] = df[aux1_string] + df[tmp]
df[aux1_string] = df[aux1_string] / len(js_positions["positionEvaluation"][p]["elementsProm"])
Явный список:
sumElements = ["attr1", "attr2"]
gralSum = ["attr2", "attr3", "attr4"]
elementsProm = ["attr1", "attr2", "attr3", "attr4"]
Ожидаемый результат:
| Product | store_location | attr1 | attr2 | attr3 | attr4 | global |
| ------- | -------------- | ----- | ----- | ----- | ----- | ------ |
| First | NY-store1 | 3 | 5 | 2 | 2 | 2,66 |
| Second | NY-store2 | 1 | 3 | 5 | 1 | 1,33 |
| Third | NJ-store1 | 3 | 5 | 2 | 2 | 3 |
| Fourth | PA-store1 | 1 | 3 | 5 | 1 | 2,5 |
@mozway — это список с именами атрибутов, которые могут отличаться от суммируемых, из gralSum нужна только длина






IIUC, вы хотите суммировать разные атрибуты независимо от того, находится ли строка NY в названии магазина?
Для этого вы можете использовать логическое индексирование и mean или sum:
sumElements = ["attr1", "attr2"]
gralSum = ["attr2", "attr3", "attr4"]
elementsProm = ["attr1", "attr2", "attr3", "attr4"]
df['global'] = np.where(df['store_location'].str.contains('NY'),
df[sumElements].sum(1).div(len(gralSum)),
df[elementsProm].mean(1))
выход:
Product store_location attr1 attr2 attr3 attr4 global
0 First NY-store1 3 5 2 2 2.666667
1 Second NY-store2 1 3 5 1 1.333333
2 Third NJ-store1 3 5 2 2 3.000000
3 Fourth PA-store1 1 3 5 1 2.500000
Позвольте мне сделать ожидаемый результат
обновление с явными списками
Извините, я думаю, если я поставлю структуру json, это будет ясно, но нет
что такое "гралсум"?