Python 按ID分组并检查值是否在误差范围内相同?
我有这样一个数据框:Python 按ID分组并检查值是否在误差范围内相同?,python,pandas,dataframe,Python,Pandas,Dataframe,我有这样一个数据框: ID Value 111 10 111 5 112 11 112 11 我想创建第三列“Check”,它将是二进制1或0(True或False),以满足以下条件:相同ID号的所有值是否在5%的误差范围内相同 例如,对于ID号111,如果值10和5相同,或者如果它们之间的百分比差异为5%,则列检查将为1。按abs(5-10)/(5+10)/2计算的百分比差 然后,输出将是: ID Value. Check 111 10 0 111
ID Value
111 10
111 5
112 11
112 11
我想创建第三列“Check”,它将是二进制1或0(True或False),以满足以下条件:相同ID号的所有值是否在5%的误差范围内相同
例如,对于ID号111,如果值10和5相同,或者如果它们之间的百分比差异为5%,则列检查将为1。按abs(5-10)/(5+10)/2计算的百分比差
然后,输出将是:
ID Value. Check
111 10 0
111 5 0
112 11 1
112 11 1
我正在使用以下代码:
a = df.groupby([df['ID']])['Value'].nunique().eq(1)
index_list = a[a].index.tolist()
df['Check'] = 0
df.loc[df['ID'].isin(index_list), 'Check'] = 1
但它只检查值是否相同,我不确定是否在检查中包含5%的差异
我也只想在每个ID号有多个观察值时执行此操作,并在只有一个观察值时将NaN返回到列检查
谢谢 尝试
transform
g = df.groupby('ID')['Value']
df['new'] = ((g.transform(np.ptp)/g.transform('mean'))<0.05).astype(int)
df
Out[40]:
ID Value new
0 111 10 0
1 111 5 0
2 112 11 1
3 112 11 1
g=df.groupby('ID')['Value']
df['new']=((g.transform(np.ptp)/g.transform('mean'))Run:
df['Check']=df.groupby([df['ID']]).Value.transform(
lambda grp:(grp.max()-grp.min())/grp.mean()<0.05)
df['Check'] = df.groupby([df['ID']]).Value.transform(
lambda grp: (grp.max() - grp.min()) / grp.mean() < 0.05)