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