我有一个大熊猫数据框,大致看起来像这样
Identity periods one two three Label
0 one 1 -0.462407 0.022811 -0.277357
1 one 1 -0.617588 1.667191 -0.370436
2 one 2 -0.604699 0.635473 -0.556088
3 one 2 -0.852943 1.087415 -0.784377
4 two 3 0.421453 2.390097 0.176333
5 two 3 -0.447321 -1.215280 -0.187156
6 two 4 0.398953 -0.334095 -1.194132
7 two 4 -0.324348 -0.842357 0.970825
我需要能够根据各列中的分组对数据进行分类,例如,我的分类标准之一是,如果在 x 和 y 期间之间存在期间列。
我必须对其进行分类的代码如下所示,生成最后一列:
for i in df['Identity'].unique():
if (2 <= df[df['Identity']==i]['periods'].max() <= 5) :
df.loc[df['Identity']==i,'label']='label 1'
我也尝试过使用
的版本df.groupby('Identity').apply().
但这并没有更快。
我的数据目前大约有 280 万行,并且有大约 900 个唯一身份。代码运行大约需要 5 分钟,这表明循环中的代码变慢,而不是循环变慢。
答案 0 :(得分:1)
让我们尝试通过使用所有矢量化 Pandas 操作来提高系统性能,而不是使用循环或 .apply()
函数,后者也只是通常在内部使用相对较慢的 Python 循环。
使用.groupby()
和.transform()
在群内广播max()
的{{1}},得到制作面具的系列。然后将 periods
与条件 2 <= max <=5 的掩码一起使用,并为满足掩码的行设置标签。
只要组内的最大周期在 2 <= max <=5 之内,就为同一 .loc[]
组的所有行假定相同的标签。
Identity