如何与数据框中的下一行进行比较?

时间:2019-06-17 17:34:30

标签: python dataframe

我有一个看起来像这样的数据框:

F_id       type     count   value     
 1           A        0      8
 1           A        2      8 
 1           B        0      2
 1           B        4      2
 1           B        1      2
 1           A        5      8
 2           A        0      3
 2           B        0      9
 1           A        1      3

我想:

  • 然后在每个组中为每个F_id分组连续类型:
  • count列与value(在当前行?下一行?上一行?)中进行比较
  • 如果下一行中的count小于value,则分配“真”

例如:

F_id      type     count   value    match     
 1         A        0      8         False
           A        2      8         True   //  2 < 8
           A        5      8         True   // 5 < 8
 1         B        0      2         False
           B        4      2         False   
           B        1      2         True  // 1 < 2 
 2         A        0      3         False
           A        1      3         True   // 1 < 3
 2         B        0      9         False

我尝试了以下操作:

n = data.groupby(['F_id','type']).apply(lambda x:
        np.where((x['F_id'] == x['F_id'].shift())&(x['type'] ==
        x['type'].shift())&(x['count'] < x['value']),True,False))

data['match'] = n.reset_index(level = 0, drop=True)

但是我得到了:

  

ValueError:无法从重复的轴重新索引

感谢您的帮助。

1 个答案:

答案 0 :(得分:0)

我将创建一个函数来检查count是否小于value。然后对数据排序并使用rank()获得每个组的排名(F_id和类型)。该功能将检查等级是否为1或计数是否小于值。

def my_fnc(row):
    return row['rank'] > 1.0 and (row['count'] < row['value'])

data = pd.DataFrame({'F_id': [1,1,1,1,1,1,2,2,2]
                   , 'type': ['A','A','B', 'B','B','A','A','B','A',]
                   , 'count': [0,2,0,4,1,5,0,0,1]
                   , 'value': [8,8,2,2,2,8,3,9,3]} )
data['index_col'] = data.index 
data=data.sort_values(by=['F_id', 'type'])
data['rank'] = data.groupby(['F_id','type'])["index_col"].rank()
data['match'] = df.apply(lambda row: my_fnc(row), axis=1)
data.drop(columns=['index_col', 'rank'])

Result:


 F_id type count value  match
0   1   A   0   8   False
1   1   A   2   8   True
5   1   A   5   8   True
2   1   B   0   2   False
3   1   B   4   2   False
4   1   B   1   2   True
6   2   A   0   3   False
8   2   A   1   3   True
7   2   B   0   9   False