在我的熊猫数据框中,我有一列非唯一值 我想添加第二个包含下一个唯一值的列 即
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)
我如何使用熊猫来实现这一目标?
答案 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
您会注意到差异在于最后一个值。当我们只能期待时,我们看到没有下一个唯一值。