使用pandas根据其他列中的条件创建一个新的ID列

时间:2019-02-14 02:04:01

标签: pandas

我正在尝试创建一个新列“ ID”,该列在每次“数据”列中没有“ NaN”值时都应提供唯一的ID。如果非null值彼此正确,则ID保持不变。为了更好地理解,我提供了我的最终Id列应如何如下所示。有人可以指导我吗?

Id  Data
0   NaN
0   NaN
0   NaN
1   54
1   55
0   NaN
0   NaN
2   67
0   NaN
0   NaN
3   33
3   44
3   22
0   NaN

2 个答案:

答案 0 :(得分:1)

.groupby累积以获取连续的组,使用where来掩盖NaN.ngroup获取连续的ID。 rank也可以。

s = df.Data.isnull().cumsum().where(df.Data.notnull())
df['ID'] = df.groupby(s).ngroup()+1
# df['ID'] = s.rank(method='dense').fillna(0).astype(int)

输出:

    Data  ID
0    NaN   0
1    NaN   0
2    NaN   0
3   54.0   1
4   55.0   1
5    NaN   0
6    NaN   0
7   67.0   2
8    NaN   0
9    NaN   0
10  33.0   3
11  44.0   3
12  22.0   3
13   NaN   0

答案 1 :(得分:1)

使用factorize

v=pd.factorize(df.Data.isnull().cumsum()[df.Data.notnull()])[0]+1
df.loc[df.Data.notnull(),'Newid']=v
df.Newid.fillna(0,inplace=True)
df
    Id  Data  Newid
0    0   NaN    0.0
1    0   NaN    0.0
2    0   NaN    0.0
3    1  54.0    1.0
4    1  55.0    1.0
5    0   NaN    0.0
6    0   NaN    0.0
7    2  67.0    2.0
8    0   NaN    0.0
9    0   NaN    0.0
10   3  33.0    3.0
11   3  44.0    3.0
12   3  22.0    3.0
13   0   NaN    0.0