我有一个长格式的熊猫数据框,其中包含一些人的多个条目。我有一个变量,指示自另一个评估(评估A)以来的一个测量时间。我想做的是创建一个新变量,该变量标识相对于评估A的每个评估的时间点,并将每个人的第一个时间点(如果它小于评估A的10天)指定为时间点1,不论自评估A以来的时间如何,其后续度量均为2、3、4等。如果他们的评估A≤10天,则我希望该人的所有条目都为NA。
我确定答案涉及groupby。我可以按每个人的代码进行分组,但是我对如何从那里进行编码非常执着。
我一直尝试遵循的逻辑是: -groupby ID_Code -对于每个ID_Code,测试第一行“自评估A起的时间” <= 10 -如果为true,则在时间点中第一行= 1,并为该ID_Code的第二,三,四等行分配值。 -否则,将该ID_Code的所有行分配为NA
如果不清楚,我可以提供更多信息。我对使用python清理数据非常陌生,这是我的第一个stackoverflow问题,因此我愿意接受任何提示!
谢谢。
{}
答案 0 :(得分:0)
将GroupBy.transform
与GroupBy.first
一起用于与原始大小相同的系列,因此可能的比较和过滤组使用GroupBy.cumcount
作为每个组的计数器:
mask = df.groupby('ID_Code')['Time_since_A'].transform('first') <= 10
df.loc[mask, 'Timepoint'] = df[mask].groupby('ID_Code').cumcount() + 1
print (df)
ID_Code Time_since_A Timepoint
0 AA_01 0 1.0
1 AA_01 134 2.0
2 BB_02 0 1.0
3 CC_03 7 1.0
4 CC_03 145 2.0
5 CC_03 289 3.0
6 CC_03 312 4.0
7 DD_05 500 NaN
8 DD_05 650 NaN
详细信息:
print (df.groupby('ID_Code')['Time_since_A'].transform('first'))
0 0
1 0
2 0
3 7
4 7
5 7
6 7
7 500
8 500
Name: Time_since_A, dtype: int64