我的数据集有数百万行,大约400个类别。每个类别包含2019年、2020年和2021年的每周数据。我试图通过将列的周值除以2019年对应的周值来规范化列值。该列包含来自不同类别的数据
示例数据如下:
sample data/m25c4.png
我希望得到如下输出: sample output
我试着使用python来实现这一点,但运行起来需要几个小时。 我的代码是这样的
for category, weeks in category_weeks_dict.items():
for week in weeks:
y = df.query("category== @category and Year==2019 and week==@week['value'].values
if not y: y=np.nan
df.loc[(df['category']==category) & (df['week']==week), 'value'] = y
代码基本上会创建一个新列,并为每个类别和周指定2019值。这样我就可以将value列除以2019 value列。 因此,我创建了一个包含每个类别及其唯一周的dict{a:[1,2,3,4],B:[1,2,3,4]…}。然后得到y,这是每个类别和每周的2019值
有没有更好的方法可以让我用熊猫来做这件事。我真的很感谢你的帮助。谢谢
如果所有年份的类别和周数相同
如果dataframe按照示例中的顺序进行排序,使得周数和类别的数量和顺序每年都完全重复,那么您可以对计算进行矢量化,这应该会快得多
使用^{} 创建一个数组,该数组包含2019年的值,重复次数与年份相同(样本数据中为2次),因此该数组的长度与整个数据帧的长度相同。然后,您可以通过将values列除以该数组来计算规范化值,这将按元素进行
注意,为了避免错误,我重命名了
values
列,因为df.values
是一个数据帧属性,包含所有列的值如果年份可能有不同的类别和周
我已经更改了下面的示例数据来说明这个案例。 无论如何,要使矢量化方法起作用,您必须为每年调整相同的类别和周数。这可以通过将数据帧转换为宽格式来实现:
现在,您可以使用NumPy的广播规则将每个值除以相应的2019值:
相关问题 更多 >
编程相关推荐