熊猫从日期开始添加值



我正在使用一个具有'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组中的行号添加到cumcountantiquity列中?

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

相关内容

  • 没有找到相关文章

最新更新