Python 将子节后缀值添加到列值

Python 将子节后缀值添加到列值,python,pandas,dataframe,Python,Pandas,Dataframe,假设我有一个具有多个列的数据帧。一个栏目为一些人建立了一个识别号(ID),另一个栏目为他们建立了一些特征,比如说他们犯下的罪行的程度。例如: `df Out[63]: Crime ID 0 13 1 1 13 1 2 12 1 3 12 1 4 13 3 5 13 3 6 13 3 7 63 3 8 63 3 9 63 3 10 63

假设我有一个具有多个列的数据帧。一个栏目为一些人建立了一个识别号(ID),另一个栏目为他们建立了一些特征,比如说他们犯下的罪行的程度。例如:

`df
Out[63]: 
    Crime  ID
0      13   1
1      13   1
2      12   1
3      12   1
4      13   3
5      13   3
6      13   3
7      63   3
8      63   3
9      63   3
10     63   3
11      3   3
12      7   6
13      7   6
14     13   6
15     13   6
16     45   6`
是否有可能根据犯罪的多样性对身份证进行分类?一种可能的产出是:

`df1
Out[64]: 
    Crime  ID
0      13   1
1      13   1
2      12   1.1
3      12   1.1
4      13   3
5      13   3
6      13   3
7      63   3.1
8      63   3.1
9      63   3.1
10     63   3.1
11      3   3.2
12      7   6
13      7   6
14     13   6.1
15     13   6.1
16     45   6.2`

提前感谢

我想不出一种矢量化的方法来实现这一点,但通过循环实现这一点相对容易

首先,您需要一个dict映射(Crime,ID)对到ID,这样,例如,您可以为第9行提供与第7行相同的ID

接下来,您需要一个dict将ID映射到目前为止使用的最高子ID,这样,例如,您可以为第16行指定一个不同于第12行和第14行的ID

类似这样(未经测试):


也许有更好的解决方案,但现在我认为嵌套的
groupby
可以做到这一点

v = df.groupby('ID', sort=False).apply(
        lambda x: x.groupby('Crime', sort=False).ngroup()).reset_index(drop=True)
df['ID'] = np.where(
        v.eq(0), df['ID'], df['ID'].astype(str) + '.' + v.astype(str))


使用
groupby
factorize

s=df.groupby(['ID'],as_index=False)['Crime'].apply(lambda x : ('.'+pd.Series(pd.factorize(x)[0]).astype(str)).replace('.0','')).reset_index(drop=True)
s
Out[121]: 
0       
1       
2     .1
3     .1
4       
5       
6       
7     .1
8     .1
9     .1
10    .1
11    .2
12      
13      
14    .1
15    .1
16    .2
Name: Crime, dtype: object

df.ID.astype(str)+s
Out[122]: 
0       1
1       1
2     1.1
3     1.1
4       3
5       3
6       3
7     3.1
8     3.1
9     3.1
10    3.1
11    3.2
12      6
13      6
14    6.1
15    6.1
16    6.2
dtype: object
df
    Crime   ID
0      13    1
1      13    1
2      12  1.1
3      12  1.1
4      13    3
5      13    3
6      13    3
7      63  3.1
8      63  3.1
9      63  3.1
10     63  3.1
11      3  3.2
12      7    6
13      7    6
14     13  6.1
15     13  6.1
16     45  6.2
s=df.groupby(['ID'],as_index=False)['Crime'].apply(lambda x : ('.'+pd.Series(pd.factorize(x)[0]).astype(str)).replace('.0','')).reset_index(drop=True)
s
Out[121]: 
0       
1       
2     .1
3     .1
4       
5       
6       
7     .1
8     .1
9     .1
10    .1
11    .2
12      
13      
14    .1
15    .1
16    .2
Name: Crime, dtype: object

df.ID.astype(str)+s
Out[122]: 
0       1
1       1
2     1.1
3     1.1
4       3
5       3
6       3
7     3.1
8     3.1
9     3.1
10    3.1
11    3.2
12      6
13      6
14    6.1
15    6.1
16    6.2
dtype: object