用下一个唯一值替换值

时间:2018-09-26 16:31:00

标签: python 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 :(得分:4)

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

答案 1 :(得分:2)

使用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

在Mart的情况下

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

答案 2 :(得分:0)

设置

添加了具有多个群集的其他数据

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

仅前进

类似于之前,除了我们将跟踪累积的最大因式分解值

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

您会注意到差异在于最后一个值。当我们只能期待时,我们看到没有下一个唯一值。