python-3.x - 根据多个条件将一列拆分为几列并分组
问题描述
我有一个示例数据框,如下所示。
import pandas as pd
data = {'ID':['A','A','A','A','A','A','A','A','A','C','C','C','C','C','C','C','C'],
'Week': ['Week1','Week1','Week1','Week1','Week2','Week2','Week2','Week2','Week3',
'Week1','Week1','Week1','Week1','Week2','Week2','Week2','Week2'],
'Risk':['High','','','','','','','','','High','','','','','','',''],
'Testing':['','Pos','','Neg','','','','','Pos', '', '','','Neg','','','','Pos'],
'Week1_adher':['','','','','','','','','', '','','','','','','',''],
'Week2_adher':['','','','','','','','','','','','','','','','',''],
'Week3_adher':['','','','','','','','','','','','','','','','','']}
df1 = pd.DataFrame(data)
df1
现在我想计算每个参与者每周的依从性。其计算如下:如果参与者在测试栏中有 2 个或更多条目(正面/负面)一周,则该周的坚持为“是”,否则为“否”
例如,对于参与者 A,第 1 周_adherence 为“是”,因为它在第 1 周的测试列中有 2 个条目。Week2_adherence 为“否”
我希望整个星期的依从性结果显示在每个参与者的第一行。
最终的数据框应该像下面给出的图像。
我已经坚持了很长一段时间。任何帮助是极大的赞赏。谢谢你。
解决方案
尝试:
adher = (df1.Testing.ne('') # check for non-empty string
.groupby([df1.ID, df1.Week]) # groupby ID and week
.sum().ge(2) # count and check >= 2
.unstack(fill_value=False)
.replace({True:'Yes', False:'No'})
.add_suffix('_adher')
)
# the first lines
mask = ~df1['ID'].duplicated()
df1.loc[mask, adher.columns] = adher.loc[df1.loc[mask,'ID']].values
输出:
ID Week Risk Testing Week1_adher Week2_adher Week3_adher
0 A Week1 High Yes No No
1 A Week1 Pos
2 A Week1
3 A Week1 Neg
4 A Week2
5 A Week2
6 A Week2
7 A Week2
8 A Week3 Pos
9 C Week1 High No No No
10 C Week1
11 C Week1
12 C Week1 Negative
13 C Week2
14 C Week2
15 C Week2
16 C Week2 Positive
推荐阅读
- php - 如果电子邮件不在数据库中,则 Google 登录重定向回登录页面
- javascript - 如果满足所有条件,如何使 .addEventListener 仅执行函数?
- node.js - Docker 的 Angular 图像因依赖错误而退出
- reactjs - 找不到模块“sass”
- python-3.x - 在循环浏览程序的某些部分时处理菜单输入?
- makefile - 多变量赋值的Makefile问题
- java - 向 Rediffmail 发送电子邮件意图,从正文中删除新行
- python - 如何为多个输入文件运行相同的python代码
- android - 模拟器 Android - React Native
- android - 如何测试应用下载和激活?