Python 将子节后缀值添加到列值
假设我有一个具有多个列的数据帧。一个栏目为一些人建立了一个识别号(ID),另一个栏目为他们建立了一些特征,比如说他们犯下的罪行的程度。例如: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
`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