Задайте значение в новом столбце данных на основе некоторого правила в существующем столбце. - PullRequest
1 голос
/ 11 января 2020

Я хочу создать новый столбец в существующем фрейме данных, где значение в каждой строке зависит от некоторого правила в соседнем столбце. Позвольте мне привести пример. У меня есть следующий словарь:

d1={"commence_time":["12/6/2019 14:00", "12/7/2019 17:30", 
                     "12/7/2019 17:30","12/8/2019 19:30",
                     "12/9/2019 19:30","12/28/2019 15:00",
                     "12/28/2019 15:00","12/28/2019 15:00"],
"value1":["5","5","5","5","5","5","5","5"]}

, и я создаю следующий фрейм данных:

df1=pd.DataFrame(data=d1)

, что приводит к:

    commence_time     value1
 0  12/6/2019 14:00     5
 1  12/7/2019 17:30     5
 2  12/7/2019 17:30     5
 3  12/8/2019 19:30     5
 4  12/9/2019 19:30     5
 5  12/28/2019 15:00    5
 6  12/28/2019 15:00    5
 7  12/28/2019 15:00    5

Я хочу создать другой столбец называется value2, где применяется следующее правило: если за временем начала следует другое время начала в следующей строке, значение2 в первой строке должно быть равно значению1. Если время начала точно такое же, как в следующей строке (или, возможно, даже в следующей строке), то числа в значении 2 представляют собой значение1, суммируемое с 5. Ожидаемый результат:

    commence_time   value1  value2
 0  12/6/2019 14:00    5      5
 1  12/7/2019 17:30    5     10
 2  12/7/2019 17:30    5     10
 3  12/8/2019 19:30    5      5
 4  12/9/2019 19:30    5      5
 5  12/28/2019 15:00   5     10
 6  12/28/2019 15:00   5     10
 7  12/28/2019 15:00   5     10

Не знаю, как на самом деле подойти к этой проблеме, чтобы я ничего не пробовал. Предложения приветствуются.

Ответы [ 2 ]

1 голос
/ 11 января 2020
import numpy
d1={"commence_time":["12/6/2019 14:00", "12/7/2019 17:30", 
                 "12/7/2019 17:30","12/8/2019 19:30",
                 "12/9/2019 19:30","12/28/2019 15:00",
                 "12/28/2019 15:00","12/28/2019 15:00"],
"value1":[5,5,5,5,5,5,5,5]}


 df1=pd.DataFrame(data=d1)

 df1['timeshift']= df1.commence_time.shift(-1)
 df1['valueshift']= df1.value1.shift(-1)

 df1['value2'] = np.where(df1.commence_time == df1.timeshift,
                     df1.value1 + df1.valueshift,df1.value1)

Привет, попробуйте, вы можете посмотреть документацию numpy для получения дополнительной информации по np.where, мое решение, вероятно, немного хакерское, но я уверен, что кто-то скоро будет рядом, чтобы улучшить его.

1 голос
/ 11 января 2020

Если ваш DataFrame выглядит отсортированным, как указано выше, то это не столько последовательная проверка, сколько проверка duplicated. Используйте маску, чтобы добавить 5 только к тем строкам, которые вы хотите.

magic_num = 5

df1['value2'] = df1.value1.astype(int) + df1.commence_time.duplicated(keep=False)*magic_num

Но если это действительно должна быть последовательная проверка строк, а не где-либо в DataFrame, вы можете выполнить эту проверку сдвинутых значений и найти группы, которые больше 1, чтобы добавить значение.

s = df1.commence_time.ne(df1.commence_time.shift()).cumsum()
df1['value2'] = df1.value1.astype(int) + (s.groupby(s).transform('size') > 1)*magic_num

      commence_time value1  value2
0   12/6/2019 14:00      5       5
1   12/7/2019 17:30      5      10
2   12/7/2019 17:30      5      10
3   12/8/2019 19:30      5       5
4   12/9/2019 19:30      5       5
5  12/28/2019 15:00      5      10
6  12/28/2019 15:00      5      10
7  12/28/2019 15:00      5      10
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...