Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/296.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 按ID分组并检查值是否在误差范围内相同?_Python_Pandas_Dataframe - Fatal编程技术网

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)