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
,则指定“True”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
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或其他人需要添加更好的测试数据。