Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/335.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 避免遍历Pandas中的每一行以进行自定义聚合_Python_Pandas_Dataframe_Pandas Groupby - Fatal编程技术网

Python 避免遍历Pandas中的每一行以进行自定义聚合

Python 避免遍历Pandas中的每一行以进行自定义聚合,python,pandas,dataframe,pandas-groupby,Python,Pandas,Dataframe,Pandas Groupby,假设我有一个熊猫数据框,有两列:salary和food\u perc(你在食物上花费的工资百分比)。每一行对应一个不同的人 将熊猫作为pd导入 将numpy作为np导入 #播种 np.随机种子(1) #创建数据帧 df=pd.DataFrame({'salary':np.round(np.random.uniform(10000,100000,100),2), “食物”:np.圆形(np.随机.均匀(0.1,0.9100,2)}) 我想要一个名为food\u compare的新专栏,其中每个人

假设我有一个熊猫数据框,有两列:
salary
food\u perc
(你在食物上花费的工资百分比)。每一行对应一个不同的人

将熊猫作为pd导入
将numpy作为np导入
#播种
np.随机种子(1)
#创建数据帧
df=pd.DataFrame({'salary':np.round(np.random.uniform(10000,100000,100),2),
“食物”:np.圆形(np.随机.均匀(0.1,0.9100,2)})
我想要一个名为
food\u compare
的新专栏,其中每个人的
food\u perc
与收入相近(+/-10%)的人相比

因为+/-10%的队列对于每个人都是不同的,所以我不认为有什么方法可以避免重复每一行并每次创建队列,如下所示

df.index中的i的
:
#隔离队列
df_sub=df[(df.loc[:,'salary']*0.9df.loc[i,'salary'])]
#比较
df.loc[i,'food_compare']=np.divide(df.loc[i,'food_perc']),
np.平均值(df_sub['food_perc']))
为每次迭代对数据帧进行子集设置实际上不是一个可伸缩的解决方案不幸的是,我无法为我正在处理的问题先发制人地创建静态存储箱(例如$10000-$20000,$20001-$30000等)。


当您没有离散键时,是否有办法执行某种
.groupby
?否则,我不知道该怎么做,除了可能事先按
salary
对行进行排序,并修改子集设置步骤,以便在构建队列时不会搜索整个数据帧之外。谢谢

pd.cut
就是为这类事情而设计的:


df.groupby(pd.cut(df[“salary”],np.arange(0,df[“salary”].max(),1.0e5))
要获得每个对等组的计数,可以使用以下方法:

data['sal_peer_group_count'] = \
     data['salary'].apply(lambda x: len(data.loc[(data['salary']>.9*x) & \
                                       (data['salary']<1.1*x)]))
请记住,如果您的
salary
中有任何项目等于零,并且希望它们位于同一组中,则需要将该语句修改为:

data['peer_group_food_perc_mean'] = \
     data['salary'].apply(lambda x: data.loc[(data['salary'] >.9*x) & \
                                             (data['salary'] < 1.1*x) \
                                              if x != 0 else \
                                              (data['salary'] == 0), 'food_perc'].mean())
data['peer\u group\u food\u perc\u mean']\
数据['salary'].apply(lambda x:data.loc[(数据['salary']>.9*x)和\
(数据['salary']<1.1*x)\
如果x!=0,其他\
(数据['salary']==0),'food_perc'].mean()

我看不出有什么办法可以满足这个要求。是否有任何理由真正需要一个以每行为中心的基于百分比的窗口,或者只需比较同一工资分位数内的行就足够了?(在这种情况下,你可以做一个快速的
groupby
)@ALollz最终产品包括查找一个人,其中一个指标是与相似的人进行比较。静态垃圾箱的问题在于,如果您位于垃圾箱的底部或顶部,那么比较组中的大部分与您完全不同,并且在设置垃圾箱截止值时存在一些主观性。如果我们试图扩展到100000行,而迭代是不可能的,那么这些缺点可能是好的。但我想在讨论静态垃圾箱之前,首先检查这个滚动窗口百分比是否可行。我同意静态垃圾箱会使这个问题变得更简单!没错,我同意这些问题。但遗憾的是,所有的
.rolling
计算都假定一个静态窗口大小,而
.groupby
确保元素只能属于一个组,这两种方法在这种情况下都没有帮助。希望其他人有一个富有想象力的解决方案。
pd.cut
在这里没有用处,因为它创建了预定义的静态存储箱(即
np.arange(0,df['salary'].max(),1.0e5)
。目标是每行需要不同的存储箱。不过,谢谢——静态存储箱是一个越来越有吸引力的替代品。
data['peer_group_food_perc_mean'] = \
     data['salary'].apply(lambda x: data.loc[(data['salary'] >.9*x) & \
                                             (data['salary'] < 1.1*x) \
                                              if x != 0 else \
                                              (data['salary'] == 0), 'food_perc'].mean())