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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何从包含一系列值的列创建新的递增值列?相关的知识,希望对你有一定的参考价值。

我对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

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

谢谢

答案

使用:

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

以上是关于如何从包含一系列值的列创建新的递增值列?的主要内容,如果未能解决你的问题,请参考以下文章

Oracle SQL:创建视图,其中不同的列名称将成为一个新的值列

如何从现有排名值创建具有递增排名值的运行范围的表?

如何将具有自动递增值的列添加到 mySql 数据库的表中?

Apache Spark:如何使用 Java 在 dataFrame 中的空值列中插入数据

SQL 从包含表名、列名和值列映射的数据表中将数据插入到多个表中,可以在源中更改

SQL:两个数据库,都有包含公共值列的表。如何查找丢失的行