我有一个看起来像这样的数据框:
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:无法从重复的轴重新索引
感谢您的帮助。
答案 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