python - 如何在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)
解决方案
用于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
推荐阅读
- python - 在 python 进程中更新变量
- python-3.x - 在 EC2 上的 virtualenv 中安装 pip 安装时 requirements.txt 文件中缺少包
- c++ - Memory leak when using CString for tree node
- c# - 循环遍历 TPL 数据流块的正确方法是什么?
- java - 需要帮助检查二叉树是否是 Java 中的有效二叉搜索树
- appium-ios - Appium WebElement.clear() 不删除预填充的 XCUIElementTypeTextField 前导空格?
- angular - 在Angular中的另一个组件上调用函数时出现问题
- azure - 从 Azure AD Powershell 导出组类型
- mailgun - Mailgun 的服务器被列入黑名单;我的外发邮件正在退回。没有支持。如何轮换IP?
- php - xampp file_get_contents 错误 - 找不到文件