我有一些在线任务的输出,我需要将其整理成可用的评分形式,这需要多个条件才能正确整理。我尝试使用 if 和 else 语句,但我很难以这种方式满足所需的所有条件。所需数据和条件的描述 - 在第一列中,有与该人的响应相对应的三个可能值:“是”、“否”或“NR”(表示尚未给出响应)。第二列是一种计数器,应该按顺序从 1 到 5 运行,但如果用户按住按键时间过长,它会重复一个值。因此,对于第二列中的每个计数,我希望第一列中有一个相应的响应,这应该是针对该计数给出的第一个响应(“是”或“否”)。如果在整个计数期间没有给出响应,则应保持为“NR”。然后计数再次从 1 到 5 重复。例如,这个输入数据: response count0 yes 11 yes 12 yes 13 no 14 yes 15 no 26 no 27 no 28 NR 39 NR 310 no 311 NR 312 NR 413 NR 414 NR 415 yes 516 yes 517 NR 118 NR 119 NR 220 yes 321 yes 322 yes 323 no 424 yes 425 no 5应该减少到这样: response count0 yes 11 no 22 no 33 NR 44 yes 55 NR 16 NR 27 yes 38 no 49 no 5这是一个有点令人困惑的问题,到目前为止,我还没有找到应用于数组的条件组合或 if/else 语句来给我想要的结果。任何帮助或想法将不胜感激!输入数据的源代码:response = ['yes','yes','yes','no','yes','no','no','no','NR','NR','no','NR','NR','NR','NR','yes','yes','NR','NR','NR','yes','yes','yes','no','yes','no']count = [1,1,1,1,1,2,2,2,3,3,3,3,4,4,4,5,5,1,1,2,3,3,3,4,4,5]data_dict = {'response': response, 'count':count}data = pd.DataFrame(data_dict)
1 回答
![?](http://img1.sycdn.imooc.com/545867280001ed6402200220-100-100.jpg)
呼唤远方
TA贡献1856条经验 获得超11个赞
尝试这个:
df.groupby(['count', (df['count'] != df['count'].shift()).cumsum()])['response']\
.apply(lambda x: 'NR' if (x.nunique()==1) & (x == 'NR').all() else x.loc[x!='NR'].iloc[0])\
.sort_index(level=1).reset_index(level=1, drop=True)
输出:
count
1 yes
2 no
3 no
4 NR
5 yes
1 NR
2 NR
3 yes
4 no
5 no
Name: response, dtype: object
细节:
让我们首先生成一个序列来获取重复组:
(df['count'] != df['count'].shift()).cumsum()
使用这个系列以及“计数”,我们可以创建响应组,
如果唯一响应的计数等于 1 并且该响应为“NR”,则为该组返回“NR”。否则,使用 返回第一个不是“NR”的响应x.loc[X!='NR'].iloc[0]。
添加回答
举报
0/150
提交
取消