将多个条件应用于python数据框

时间:2020-09-23 18:08:26

标签: python pandas dataframe

我有一个在线任务的输出,需要将其整理成可用的评分形式,这需要多个条件才能正确处理。我尝试使用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)

1 个答案:

答案 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'的第一个答复。