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

时间:2018-02-28 15:01:27

标签: python pandas dataframe jupyter-notebook

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

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

由于

1 个答案:

答案 0 :(得分: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