Замена значений следующим уникальным - PullRequest
0 голосов
/ 26 сентября 2018

В моем фрейме данных pandas у меня есть столбец неуникальных значений. Я хочу добавить второй столбец, который содержит следующее уникальное значение, т. Е.

col
1
5
5
2
2
4

col addedCol
1     5
5     2
5     2
2     4
2     4
4     (last value doesn't matter)

как мне достичьэто с использованием панд?

  • Я поясню, что я имел в виду, я хочу, чтобы каждая строка содержала следующее значение, отличное от значения этой строки. Надеюсь, я лучше объясню себя сейчас

Ответы [ 3 ]

0 голосов
/ 26 сентября 2018

Использование factorize

s=pd.factorize(df.col)[0]
pd.Series(s+1).map(dict(zip(s,df.col)))
Out[242]: 
0    5.0
1    2.0
2    2.0
3    NaN
dtype: float64

#df['newadd']=pd.Series(s+1).map(dict(zip(s,df.col))).values

В состоянии Март

s=df.col.diff().ne(0).cumsum()
(s+1).map(dict(zip(s,df.col)))
Out[260]: 
0    5.0
1    2.0
2    2.0
3    4.0
4    4.0
5    5.0
6    NaN
7    NaN
Name: col, dtype: float64
0 голосов
/ 26 сентября 2018

IIUC, вам нужно следующее значение, которое отличается от текущего значения.

df.loc[:, 'col2'] = df.drop_duplicates().shift(-1).col
df['col2'].ffill(inplace=True)

    col col2
0   1   5.0
1   5   2.0
2   5   2.0
3   2   2.0

(обратите внимание, что последнее значение 2.0 не имеет значения).Как предлагает @ MartijnPieters,

df['col2'] = df['col2'].astype(int)

Может возвращать значения исходным целым при необходимости.


Добавление еще одного хорошего решения из @ piRSquared

df.assign(addedcol=df.index.to_series().shift(-1).map(df.col.drop_duplicates()).bfill())

    col addedcol
0   1   5.0
1   5   2.0
2   5   2.0
3   2   NaN

Другой пример, если df равно

    col
0   1
1   5
2   5
3   2
4   3
5   3
6   10
7   9

Тогда

df.loc[:, 'col2'] = df.drop_duplicates().shift(-1).col
df = df.ffill()

дает

    col col2
0   1   5.0
1   5   2.0
2   5   2.0
3   2   3.0
4   3   10.0
5   3   10.0
6   10  9.0
7   9   9.0
0 голосов
/ 26 сентября 2018

Настройка

Добавлены дополнительные данные с несколькими кластерами

df = pd.DataFrame({'col': [*map(int, '1552554442')]})

Две интерпретации

Мы должны рассмотреть, когда существуют несмежные кластеры

df

   col   
0    1   # First instance of `1` Next unique is `5`
1    5   # First instance of `5` Next unique is `2`
2    5   #                       Next unique is `2`
3    2   # First instance of `2` Next unique is `4` because `5` is not new
4    5   #                       Next unique is `4`
5    5   #                       Next unique is `4`
6    4   # First instance of `4` Next unique is null
7    4   # First instance of `4` Next unique is null
8    4   # First instance of `4` Next unique is null
9    2   # Second time seen `2` Should Next unique be null or what it was before `4`

Разрешено оглядываться назад

Использовать factorize и добавлять 1.Это очень похоже на ответ @ Wen

i, u = df.col.factorize()
u_ = np.append(u, -1)  # Append an integer value to represent null

df.assign(addedcol=u_[i + 1])

   col  addedcol
0    1         5
1    5         2
2    5         2
3    2         4
4    5         2
5    5         2
6    4        -1
7    4        -1
8    4        -1
9    2         4

Only Forward

Аналогично предыдущему, за исключением того, что мы будем отслеживать совокупное максимальное факторизованное значение

i, u = df.col.factorize()
u_ = np.append(u, -1)  # Append an integer value to represent null

x = np.maximum.accumulate(i)

df.assign(addedcol=u_[x + 1])

   col  addedcol
0    1         5
1    5         2
2    5         2
3    2         4
4    5         4
5    5         4
6    4        -1
7    4        -1
8    4        -1
9    2        -1

Вы заметите, что разница в последнем значении.Когда мы можем только смотреть вперед, мы видим, что следующего уникального значения не существует.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...