我正在使用一个具有'date', 'id'和'antiquity'的数据集。对于同一件产品,即使日期改变,其古董也始终相同:
date id antiquity
01/06/2015 21972.00 5241.00
02/06/2015 21972.00 5241.00
03/06/2015 21972.00 5241.00
04/06/2015 21972.00 5241.00
05/06/2015 21972.00 5241.00
或:
date id antiquity
01/06/2015 28794.00 4157.00
02/06/2015 28794.00 4157.00
03/06/2015 28794.00 4157.00
04/06/2015 28794.00 4157.00
05/06/2015 28794.00 4157.00
在这个数据集中是一个错误。我需要在每行和id的"古董"列中添加1(从最古老的日期开始增加古董):第一行为这个id的"古董"值添加0,第二行为这个id的"古董"值添加1,第三行为这个产品id的"古董"值添加2……等等。
我创建了一个def来执行这个操作:
def add_antiquity(dataframe):
antiquity_id = dataframe.antiquity.values
return pd.Series([int(antiquity_id[i])+i for i in range(0,len(antiquity_id))], index=dataframe.index)
我用一行调用这个函数(只是为了测试函数):
new_serie = add_antiquity(df[df['id'] == 21972.0])
df[df.index.isin(new_serie.index)]['antiquity'] = new_serie
当我执行它,它返回给我一个"SettingWithCopyWarning"但是它不起作用,数据帧值没有更新。我想为每个id做一个循环,然后调用这个函数。
如何执行此操作?是否有任何方法可以使用任何像apply()之类的pandas函数?
谢谢!
是否可以将id
组中的行号添加到cumcount
的antiquity
列中?
df['antiquity'] += df.groupby('id').cumcount()
df
输出:
date id antiquity
0 01/06/2015 21972.0 5241.0
1 02/06/2015 21972.0 5242.0
2 03/06/2015 21972.0 5243.0
3 04/06/2015 21972.0 5244.0
4 05/06/2015 21972.0 5245.0
5 01/06/2015 28794.0 4157.0
6 02/06/2015 28794.0 4158.0
7 03/06/2015 28794.0 4159.0
8 04/06/2015 28794.0 4160.0
9 05/06/2015 28794.0 4161.0
注:当然,数据集必须按date
排序才能正常工作。如果不是,从
df = df.sort_values('date')
P.P.S.如果出于某种原因,您希望使用函数来代替它(速度较慢,因此通常不推荐),那么代码的问题在于您在数据框的副本上设置了新值(df[...][...]
返回副本)。修复方法是使用loc
:
df.loc[df.index.isin(new_serie.index), 'antiquity'] = new_serie