#python #pandas
#python #pandas
Вопрос:
У меня есть следующий фрейм данных pandas:
PN | LastS | CurrentS | Price
111111 | 100001 | 100002 | 28
111111 | 100001 | 100001 | 32
111111 | 100001 | 100004 | 48
111111 | 100001 | 100003 | 19
222222 | 100004 | 100001 | 200
222222 | 100004 | 100003 | 236
222222 | 100002 | 100005 | 397
222222 | 100003 | 100006 | 302
Извините, ребята, изначально вопрос был неясен, это моя вина. Итак, столбец LastS обозначает предыдущих поставщиков, а столбец CurrentS — текущего поставщика.
Я хотел бы узнать для данного номера детали (в нашем случае 111111 или 222222):
1) Если все предыдущие поставщики одинаковы, то есть все значения в столбце LastS одинаковы для каждого PN (строки 1,2,3,4 обозначают один и тот же PN). В данном случае — 100001. Если это значение true, то найдите это значение в текущем столбце (но выполните итерацию только для первого PN — 111111). Затем в нашем случае мы находим ее в строке 2 и берем соответствующую цену из столбца Price и помещаем ее в новый столбец New Price.
2) Если предыдущие поставщики для данного номера детали не такие, как в случае с PN — 222222, мы берем последнюю строку для этого PN (последняя строка столбца LastS-100003) и действуем по той же логике, что и one ( находим значение в строке 6 в столбце CurrentS и берем соответствующую цену)
Я попытался запустить цикл for, сгруппировать по столбцу ‘PN’, а затем проверить, длится ли max () == min () для столбца ‘LastS’. Если это правда, я не уверен, как действовать дальше, и возможно ли это с учетом текущей структуры данных.
Я ожидаю, что конечный результат будет представлен таким образом:
PN | LastS | CurrentS | Price | New Price
111111 | 100001 | 100002 | 28 | 32
111111 | 100001 | 100001 | 32 | 32
111111 | 100001 | 100004 | 48 | 32
111111 | 100001 | 100003 | 48 | 32
222222 | 100004 | 100001 | 200 | 236
222222 | 100004 | 100003 | 236 | 236
222222 | 100002 | 100005 | 397 | 236
222222 | 100003 | 100006 | 302 | 236
Комментарии:
1. На самом деле непонятно, о чем вы спрашиваете. Если вы говорите «для каждой строки проверьте, совпадает ли длительность для этой строки с текущими значениями для этой строки», тогда нет никакого смысла искать эти текущие значения. Если это не то, что вы имеете в виду, то я могу только догадываться, что вы имеете в виду.
2. Не дублируются ли текущие значения в каждой группе?
3. Я думаю, он имеет в виду 1) если существует строка, где currents = lasts, выведите цену из этой строки r во все строки, разделяющие PIN-код с r, в противном случае 2) понятия не имею (возможно, возьмите цену из последней строки при сортировке по длительности, а затем по токам)
4. Я не понимаю, как вы достигаете желаемого результата. В соответствии с вашим вопросом (и, в частности, условием 2). Просто в качестве примера, согласно тому, что вы говорите, у вас должна быть новая цена = 48 в строке 6 (последнее появление 10003 находится в строке 4, и его цена равна 48).
5. Возможно, я неправильно понимаю, но, похоже, для каждой группы по 1. Примите последнее значение в LastS. На основе этого значения. 2. найдите строку с этим значением в текущем S 3. Используйте цену этой строки.
Ответ №1:
У вас действительно есть одно условие; если все значения одинаковы, то вы все равно хотите принять последнее LastS
значение.
Мы получаем это последнее значение, затем объединяем, чтобы выбрать правильную CurrentS
строку, и возвращаем цену за каждый PN обратно с отображением:
df1 = df.groupby('PN').LastS.last().to_frame('CurrentS').reset_index()
s = df.merge(df1).rename(columns={'Price': 'New Price'}).set_index('PN')['New Price']
df['New Price'] = df['PN'].map(s)
Вывод:
PN LastS CurrentS Price New Price
0 111111 100001 100002 28 32
1 111111 100001 100001 32 32
2 111111 100001 100004 48 32
3 111111 100001 100003 19 32
4 222222 100004 100001 200 236
5 222222 100004 100003 236 236
6 222222 100002 100005 397 236
7 222222 100003 100006 302 236