Не уверен, подходит ли текущая структура данных

#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