Создание уникальных идентификаторов в цикле - PullRequest
0 голосов
/ 10 февраля 2020

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

Я знаю, что приведенный ниже код будет удовлетворять условию np.where((df['col']==1),((df['col'] != df1['col'].shift(1)).astype(int).cumsum()),0)

Но если я помещу код внутри некоторого l oop Я не хочу, чтобы cumsum() снова начинался с 1. Это создаст дубликаты в конце. Как я могу преодолеть это?

Можно ли генерировать случайные числа для этого конкретного условия? Поэтому, если оно внутри l oop, я все равно буду создавать случайные числа вместо дублирующих

column_name
1
0
0
1
1
1
1
0
0
1

column_name -- ID
1 -- 1
0 -- 0
0 -- 0
1 -- 2
1 -- 2
1 -- 2
1 -- 2
0 -- 0
0 -- 0
1 -- 3

1 Ответ

0 голосов
/ 10 февраля 2020

Вот простой способ получения последовательных внутренних идентификаторов:

# setup environment
import pandas as pd
import numpy as np
np.random.seed(13)

df = pd.DataFrame({'col': [1, 0, 0, 1, 1, 1, 1, 0, 0, 1]})

# create masks for use in later updates
msk_one = df['col'] == 1
msk_first = df['col'] != df['col'].shift()

# mark each time a new series of 1s begins with a True
df['ID'] = msk_one & msk_first

# add up the Trues to get sequential ids
df['ID'] = df['ID'].cumsum()

# drop ids on the False rows
df.loc[~msk_one, 'ID'] = 0

print(df)

#    col  ID
# 0    1   1
# 1    0   0
# 2    0   0
# 3    1   2
# 4    1   2
# 5    1   2
# 6    1   2
# 7    0   0
# 8    0   0
# 9    1   3

Чтобы преобразовать эти последовательные идентификаторы в случайные идентификаторы, вы можете сделать это:

# create conversion dict mapping from sequential to random IDS
ids = df['ID'].unique()
# ignore zeros because we want to manually map them to themselves
ids = ids[ids != 0]
random_ids = np.random.choice(ids, len(ids), replace=False)
sequential_to_random = {non_random_id: random_id for non_random_id, random_id in zip(ids, random_ids)}
sequential_to_random[0] = 0

# convert the IDs to random ints
df['ID'] = df['ID'].apply(lambda x: sequential_to_random[x])

print(df)

#    col  ID
# 0    1   2
# 1    0   0
# 2    0   0
# 3    1   1
# 4    1   1
# 5    1   1
# 6    1   1
# 7    0   0
# 8    0   0
# 9    1   3

Надеюсь, это поможет!

...