Python 如何将数据帧中的数据标准化为时间序列的起始值?

Python 如何将数据帧中的数据标准化为时间序列的起始值?,python,pandas,Python,Pandas,我想分析一个使用熊猫的临床研究数据集。 患者在不同的诊所就诊,并测量一些参数。我想将血液参数标准化为第一次就诊的值(基线值),即:标准化=参数[Visite X]/参数[Visite 1]。 数据集大致类似于以下示例: 将熊猫作为pd导入 将numpy作为np导入 rng=np.random.RandomState(0) 数据帧({'Patient':['A','A','A','B','B','B','C','C','C',], “访问”:[1,2,3,1,2,3,1,2,3], “参数”:rn

我想分析一个使用熊猫的临床研究数据集。 患者在不同的诊所就诊,并测量一些参数。我想将血液参数标准化为第一次就诊的值(基线值),即:标准化=参数[Visite X]/参数[Visite 1]。 数据集大致类似于以下示例:

将熊猫作为pd导入
将numpy作为np导入
rng=np.random.RandomState(0)
数据帧({'Patient':['A','A','A','B','B','B','C','C','C',],
“访问”:[1,2,3,1,2,3,1,2,3],
“参数”:rng.randint(0,100,9)},
列=[“患者”、“就诊”、“参数”])
df
病人就诊参数
044
1 A 2 47
2 A 3 64
3 B 1 67
4 B 2 67
5 B 3 9
6 C 1 83
7 C 2 21
8 C 3 36
现在,我想添加一列,其中包括每个标准化为基线值的参数,即访问1时的值。最简单的方法是添加一列,其中只包含每个患者的就诊1值,然后简单地将参数列除以添加的列。但是,我没有创建这样一个列,它将为每个患者添加基线值。但可能也有一行解决方案,而不添加另一列 任何帮助都将不胜感激

结果应该如下所示:

患者就诊参数标准化
0A1441.0
1A 2471.07
2 A 3 64 1.45
3B1671.0
4B2671.0
5B390.13
6C1831.0
7 C2 21 0.25
8 C 3 36 0.43
IIUC


如果需要创建新的数据帧:

df2 = df.assign(Normalized = df['Parameter'].div(df.groupby('Patient')['Parameter'].transform('first')))
我们也可以按照我的建议使用lambda

或:


@ansev说什么:
GroupBy.transform

如果您希望保留
参数
列,只需运行他编写的最后一行,但将
规范化
而不是
参数
作为新列名:


df=df.assign(Normalized=lambda x:x['Parameter'].div(x.groupby('Patient')['Parameter'].transform('first'))

好的第一个问题!非常感谢!在我的简单示例中,您的解决方案非常有效。但是,当我将其应用于更复杂的数据集时,.transform('first')命令将这些值规范化为其他值。但是,使用与下面Christian Decker建议的lambda相同的命令,显示了正确的值。仍然需要找出这种差异的原因,因为,至少在我简单的头脑中,两者都是一样的……实际上是我建议使用assign。在这种情况下没有区别@米克尔:你完全正确。实际上,我更喜欢不使用assign和lambda的方法。不幸的是,我无法在我的真实数据集中使用。你知道使用这些方法中的一种会有什么不同吗?或者,在没有具体示例的情况下,是否可以说一般情况下?assign与new列名的奇怪行为,它们应该是相同的。可能值得再问一个问题,比如说最小的可重复性。@ansev使用新的数据帧也没有帮助。当我有时间的时候,我可以用@Evgeny建议的可复制数据集问一个新问题。原始数据集包含敏感数据,因此我无法直接使用它。非常感谢你的全面回答!
df['Normalized'] = df['Parameter'].div(df.groupby('Patient')['Parameter']
                                         .transform('first')).round(2)
print(df)
  Patient  Visit  Parameter  Normalized
0       A      1         44        1.00
1       A      2         47        1.07
2       A      3         64        1.45
3       B      1         67        1.00
4       B      2         67        1.00
5       B      3          9        0.13
6       C      1         83        1.00
7       C      2         21        0.25
8       C      3         36        0.43
df2 = df.assign(Normalized = df['Parameter'].div(df.groupby('Patient')['Parameter'].transform('first')))
df2 = df.copy()
df2['Normalized'] = df['Parameter'].div(df.groupby('Patient')['Parameter']
                                         .transform('first'))