我有一个在线任务的输出,需要将其整理成可用的评分形式,这需要多个条件才能正确处理。我尝试使用if和else语句,但是我很难满足这种方式所需的所有条件。 所需数据和条件的描述-在第一列中,对应于此人的响应的三个可能值:“是”,“否”或“ NR”(表示尚未给出响应)。第二列是一种计数器,应该按1-5的顺序运行,但是如果有人按住键的时间过长,它将重复一个值。因此,对于第二列中的每个计数,我希望第一列中有一个相应的响应,该响应应该是对该计数给出的第一个响应(“是”或“否”)。如果在整个计数过程中未给出任何响应,则应保持为“ NR”。然后,计数从1-5重复一次。例如,此输入数据:
response count
0 yes 1
1 yes 1
2 yes 1
3 no 1
4 yes 1
5 no 2
6 no 2
7 no 2
8 NR 3
9 NR 3
10 no 3
11 NR 3
12 NR 4
13 NR 4
14 NR 4
15 yes 5
16 yes 5
17 NR 1
18 NR 1
19 NR 2
20 yes 3
21 yes 3
22 yes 3
23 no 4
24 yes 4
25 no 5
应减少为:
response count
0 yes 1
1 no 2
2 no 3
3 NR 4
4 yes 5
5 NR 1
6 NR 2
7 yes 3
8 no 4
9 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)
答案 0 :(得分:0)
尝试一下:
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'。否则,请使用x.loc[X!='NR'].iloc[0]
返回不是'NR'的第一个答复。