如何从包含一系列值的列创建新的递增值列?

问题描述 投票:1回答:1

我对Pandas / Python很新,所以如果这很直截了当,请道歉。我正在开展一个工作项目,可以提供一些帮助。

我有一些数据描述了血液样本在储存盒中的位置。我目前在“1_5”形式的名为“位置”的列中具有一定数量的样本占据的位置范围,这意味着这些样本占据了存储盒中的位置1,2,3,4和5。

[数据框图片] [1] [1]:https://i.stack.imgur.com/DMhZm.jpg

我想要的是提供的范围内的每个样本都有自己独立的位置编号。因此,而不是目前看起来像这样的数据:

病人 - 盒子 - 位置

病人1 - 方框1 - 97_100

病人1 - 方框1 - 97_100

病人1 - 方框1 - 97_100

病人1 - 方框1 - 97_100

病人1 - 方框2 - 30_32

病人1 - 方框2 - 30_32

病人1 - 方框2 - 30_32

我希望它看起来像这样:

病人 - 盒子 - 位置

病人1 - 方框1 - 97

病人1 - 方框1 - 98

病人1 - 方框1 - 99

病人1 - 方框1 - 100

病人1 - 方框2 - 30

病人1 - 方框2 - 31

病人1 - 方框2 - 32

有人知道解决这个问题的方法吗?

谢谢

python pandas dataframe jupyter-notebook
1个回答
0
投票

使用:

df['Position'] = (df.groupby('Position').cumcount() + 
                 df['Position'].str.split('_').str[0].astype(int))
print (df)
     Patient    Box  Position
0  patient 1  box 1        97
1  patient 1  box 1        98
2  patient 1  box 1        99
3  patient 1  box 1       100
4  patient 1  box 2        30
5  patient 1  box 2        31
6  patient 1  box 2        32

详情:

通过GroupBy.cumcount获得每组的计数:

print (df.groupby('Position').cumcount())
0    0
1    1
2    2
3    3
4    0
5    1
6    2
dtype: int64   

并在Position转换为_之前添加列integer的第一个提取值:

print (df['Position'].str.split('_').str[0].astype(int))
0    97
1    97
2    97
3    97
4    30
5    30
6    30
Name: Position, dtype: int32
© www.soinside.com 2019 - 2024. All rights reserved.