Сохраните предыдущее значение ячейки и скопируйте его в следующие ячейки. - PullRequest
1 голос
/ 04 ноября 2019

Если когда-либо данные имеют категорию B, а следующая строка также содержит категорию B, то значение первой ячейки должно быть скопировано в следующую ячейку. Формула, которая должна применяться только для категории B.

, здесь столбец Value показывает исходное значение, а столбец Expected показывает, какое значение следует ожидать. Я попытался использовать команду shift, но она не используется для сохранения значения.

Моя база данных очень большая, прикрепленный - это просто пример.

'' 'Code Tried' ''

df['expected'] = df.groupby('category')['value'].transform('first')

Приведенный выше код копирует значение 20 во всех местах категории B.

Ответы [ 2 ]

1 голос
/ 04 ноября 2019

Вот метод numpy:

df = pd.DataFrame({"Category":list("AABBCBBBD"),"Data":[50,50,20,30,40,25,30,35,50]})                     
# create result column
df["Modified"] = df["Data"]
# get underlying numpy array
data = df["Modified"].to_numpy()
# get mask of B positions
B = df["Category"].to_numpy()=="B"
# find on and off indices
dB, = np.where(np.diff(B, prepend=False, append=False))
# repeat the first element of each block len(block) times and fill them
# in according to the mask
data[B] = data[dB[::2]].repeat(dB[1::2]-dB[::2])

# admire
df
#  Category  Data  Modified
# 0        A    50        50
# 1        A    50        50
# 2        B    20        20
# 3        B    30        20
# 4        C    40        40
# 5        B    25        25
# 6        B    30        25
# 7        B    35        25
# 8        D    50        50
1 голос
/ 04 ноября 2019

Разделить каждый континуум B на groupID s и groupby s с Category

s = df.Category.ne('B').cumsum()
df['New_val'] = df.groupby(['Category', s])['Value'].transform('first')

Out[23]:
   Time Category  Value  New_val
0  9:00        A     50       50
1  9:01        A     50       50
2  9:02        B     20       20
3  9:03        B     30       20
4  9:04        C     40       40
5  9:05        B     25       25
6  9:06        B     30       25
7  9:07        B     35       25
8  9:08        D     50       50
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...