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

Python 如何与数据框中的下一行进行比较?,python,dataframe,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

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

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
    ,则指定“True”
例如:

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
F_id类型计数值匹配
1 A 0 8错误
A 2 8真//2<8
正确的//5<8
1 B 0 2错误
B 4 2错误
B 1 2正确//1<2
2 A 0 3错误
A 13真//1<3
2B09错误
我尝试了以下方法:

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)
n=data.groupby(['F_id','type'])。应用(lambda x:
其中((x['F_id']==x['F_id'].shift())和(x['type']==
x['type'].shift())和(x['count']
但我得到了:

ValueError:无法从重复轴重新编制索引


非常感谢您的帮助。

我将创建一个函数来检查计数是否小于值。然后对数据进行排序,并使用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
def my_fnc(世界其他地区):
返回行['rank']>1.0和(行['count']<行['value'])
data=pd.DataFrame({'F_id':[1,1,1,1,1,2,2]
,类型:['A','A','B','B','B','A','A','B','A','B','A',]
,“计数”:[0,2,0,4,1,5,0,0,1]
,“值”:[8,8,2,2,8,3,9,3]})
数据['index_col']=data.index
data=data.sort_值(按=['F_id','type'])
data['rank']=data.groupby(['F_id','type'])[“index_col”].rank()
数据['match']=df.apply(lambda行:my_fnc(行),轴=1)
data.drop(列=['index\u col','rank'])
结果:
F_id类型计数值匹配
0 1 A 0 8错误
1 A 2 8正确
5 1 A 5 8正确
21B02错误
3 1 B 4 2错误
4 1 B 1 2正确
6 2 A 0 3错误
8 2 A 1 3正确
7 2 B 0 9错误

我认为pivot表就是您要寻找的,为什么每个组的第一行都有
match=False
,即使
value[I]
?啊,你的意思一定是“与前一行比较”,而不是“与下一行比较”。i、 e.
match[i]取决于值[i-1]
为了清晰起见,我试图编辑你的问题,但你能自己编辑吗?
np。其中((x['F_id']==x['F_id']…
groupby('F_id')中应该是完全不必要的
。您在该groupby中永远不会有不同的
F\u id
s。事实上,您甚至无法在
groupby('F\u id')中访问
F\u id
。另一个问题:在您的示例中,
列恰好在每个组中都是常量,但您的问题陈述告诉我们您要比较不同行的
计数
。因此,您应该真正展示一个能够消除这种差异的示例,即不要保持
常量。Otherwise你已经从错误的行中得到了引用值的答案,但是你的测试数据掩盖了这个问题。你能改进你的问题和数据吗?问题是有问题的,显然OP想要比较不同行的值和计数,但是他们的测试数据有值在每个组中,列恰好是常数,所以错误的答案将悄悄通过。OP或其他人需要添加更好的测试数据。