首页 > 解决方案 > 如何在groupby之后创建变量

问题描述

我有一个长格式的熊猫数据框,其中包含一些人的多个条目。我有一个变量表示自另一次单独评估(评估 A)以来的一次测量时间。我想做的是创建一个新变量来标识每个评估相对于评估 A 的时间点,并将每个人的第一个时间点(如果它 <= 评估 A 的 10 天)分配为时间点 1,然后他们随后的测量为 2、3、4 等。无论自评估 A 以来的时间如何。如果他们没有评估 <= 评估 A 的 10 天,那么我希望该人的所有条目都是 NA。

我确定答案涉及 groupby。我可以按每个人的代码进行分组,但我很困惑如何从那里开始。

我一直试图遵循的逻辑是: - groupby ID_Code - 对于每个 ID_Code,测试第一行“自评估 A 以来的时间”是否 <= 10 - 如果为真,则时间点中的第一行 = 1 并分配 ID_Code 的后续行 2, 3、4 等 - 否则,将该 ID_Code 的所有行分配为 NA

如果不清楚,我可以提供更多信息。我对使用 python 清理数据很陌生,这是我的第一个 stackoverflow 问题,所以我愿意接受任何提示!

提前致谢。

import pandas as pd

# Current data
df = pd.DataFrame(data={'ID_Code':['AA_01', 'AA_01', 'BB_02', 'CC_03', 'CC_03', 'CC_03', 'CC_03', 'DD_05', 'DD_05'],
                       'Time_since_A':[0, 134, 0, 7, 145, 289, 312, 500, 650]})
print(df)

# Intended output
df2 = pd.DataFrame(data={'ID_Code':['AA_01', 'AA_01', 'BB_02', 'CC_03', 'CC_03', 'CC_03', 'CC_03', 'DD_05', 'DD_05'],
                       'Time_since_A':[0, 134, 0, 7, 145, 289, 312, 500, 650],
                        'Timepoint':[1, 2, 1, 1, 2, 3, 4, 'NA', 'NA']})
print(df2)

标签: pythonpandaspandas-groupby

解决方案


用于GroupBy.transformGroupBy.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

推荐阅读