Python For循环中:如何将值与groupby函数中的值进行比较

Python For循环中:如何将值与groupby函数中的值进行比较,python,for-loop,conditional-statements,pandas-groupby,conditional-operator,Python,For Loop,Conditional Statements,Pandas Groupby,Conditional Operator,如何将一行与一组值进行比较?我试图在分组的时间窗口中遍历各个ID,并将唯一ID与时间间隔中其他ID的值进行比较。条件语句只考虑阈值以下或以上的值,如果是真的,则在新列中附加值1。< /P> 我有以下代码: time = np.array([1,1,1,1,2,2,2,2,2,2,3,3,3,3,3]) ids = np.array([3271,3229,4228,2778,4228,3271,3229,3229,4228,2778,4228,3271,4228,3229,3271]) vec_l

如何将一行与一组值进行比较?我试图在分组的时间窗口中遍历各个ID,并将唯一ID与时间间隔中其他ID的值进行比较。条件语句只考虑阈值以下或以上的值,如果是真的,则在新列中附加值1。< /P> 我有以下代码:

time = np.array([1,1,1,1,2,2,2,2,2,2,3,3,3,3,3])
ids = np.array([3271,3229,4228,2778,4228,3271,3229,3229,4228,2778,4228,3271,4228,3229,3271])
vec_len = np.array([,0.1,0.5,-0.0,0.0,0.1,-0.7,-0.3,-0.8,-0.6,0.2,0.1,-0.7,-0.3,-0.8])
quad = np.array([7,0,0,5,0,6,5,2,5,5,0,6,5,2,5])

df = pd.DataFrame({'time': time, 'id': ids, 'vec_len': vec_len, 'id': ids})
df['intera'] = np.array(0)

id_group=df.groupby(['time'])

interaction = []
for g_idx, group in id_group:
    for r_idx, row in group.iterrows():
        if (row['vec_len'] > group.groupby('id')['vec_len'].quantile(0.75) or row['vec_len'] < 
                       group.groupby('id')['vec_len'].quantile(0.25)):
            interaction.append('1')

我建议你首先计算分位数,然后应用你的逻辑得到交互变量。很少需要使用循环迭代数据帧的行,通常有一种更快的方法可用

你可以这样做:

df=pd.DataFrame({'time':time,'id':ids,'vec_len':vec_len,'id':ids})
grp=df.groupby(['time','id']))
分位数=grp.vec_len.quantile([.25,.75])。取消堆栈(级别=2)。重置索引()
df=df.merge(分位数,on=['time','id'])
df.loc[:,'intera']=df['vec_len',0.25,0.75].申请(
λx:1如果x[0]x[2]否则为0,轴=1
)

如果您不需要分位数变量,那么您可以直接删除它们。

非常感谢,但是为什么我不能合并这两个系列?您的意思是同时合并分位数系列吗?此代码在quantiles=pd处出错。merge(quant_25,quant_75,on=['time',id'])表示。“ValueError:无法合并没有名称的序列”。复制粘贴上述内容在python 3.7中有效。在任何情况下,请尝试更新的答案。这是超级感谢你非常感谢,这是伟大的帮助!!下一步是在新列中配对交互ID。如果您知道一个简单的方法,
vec_len
的第一个元素缺失,并且值与示例中的值不同
vec_len[3]
在代码中是
-0.0
,但在您的示例中是
-0.3
time   id   vec_len  quadrant   interaction  

1    3271    0.9    7   0 
1    3229    0.1    0   0
1    4228    0.5    0   0
1    2778   -0.3    5   0
2    4228    0.2    0   0
2    3271    0.1    6   0
2    3229    -0.7   5   1    
2    3229    -0.3   2   0
2    4228    -0.8   5   1    
2    2778   -0.6    5   1    
3    4228    0.2    0   0
3    3271    0.1    6   0
3    4228    -0.7   5   1    
3    3229    -0.3   2   0
3    3271    -0.8   5   1