首页 > 解决方案 > 如何获得数据框中行的值的差异?(用于客户代码)

问题描述

我的数据集有 Customer_Code、As_Of_Date 和 24 个产品。产品的值为 0 -1。我按客户代码和 as_of_date 订购了数据集。我想从产品的下一行减去上一行。这里重要的是根据他们的 as_of_date 让每个客户离开。

我试试

df2.set_index('Customer_Code').diff()

df2.set_index('As_Of_Date').diff()

对于我在 new["Customer_Code"].unique():
df14 = df12.set_index('As_Of_Date').diff()

但不是真的。我的代码适用于第一个客户,但不适用于第二个客户。我该怎么办?

标签: pythonpandasdataframe

解决方案


你没有分享任何数据,所以我编造了一些你可以使用的东西。您的预期结果也有所欠缺。如需进一步参考,请勿分享图片。假设您有以下数据:

  id        date   product 
0    12  2008-01-01         1
1    12  2008-01-01         2
2    12  2008-01-01         1
3    12  2008-01-02         4
4    12  2008-01-02         5
5    34  2009-01-01         6
6    34  2009-01-01         7
7    34  2009-01-01        84
8    34  2009-01-02         4
9    34  2009-01-02         3
10   34  2009-01-02         3
11   34  2009-01-03         5
12   34  2009-01-03         6
13   34  2009-01-03         8

据我了解,您想从上一行中减去产品值,按 id 和日期分组。(如果有任何其他组,适应)。然后你需要这样做:

mask = df.duplicated(['id', 'date'])
df['product_diff'] = (np.where(mask, (df['product'] - df['product'].shift(1)), np.nan))

返回:

    id        date   product   product_diff
0    12  2008-01-01         1           NaN
1    12  2008-01-01         2           1.0
2    12  2008-01-01         1          -1.0
3    12  2008-01-02         4           NaN
4    12  2008-01-02         5           1.0
5    34  2009-01-01         6           NaN
6    34  2009-01-01         7           1.0
7    34  2009-01-01        84          77.0
8    34  2009-01-02         4           NaN
9    34  2009-01-02         3          -1.0
10   34  2009-01-02         3           0.0
11   34  2009-01-03         5           NaN
12   34  2009-01-03         6           1.0
13   34  2009-01-03         8           2.0

或者如果你想反过来:

mask = df.duplicated(['id', 'date'])

df['product_diff'] = (np.where(mask, (df['product'] -  df['product'].shift(-1)), np.nan))

这使:

   id        date   product   product_diff
0    12  2008-01-01         1           NaN
1    12  2008-01-01         2           1.0
2    12  2008-01-01         1          -3.0
3    12  2008-01-02         4           NaN
4    12  2008-01-02         5          -1.0
5    34  2009-01-01         6           NaN
6    34  2009-01-01         7         -77.0
7    34  2009-01-01        84          80.0
8    34  2009-01-02         4           NaN
9    34  2009-01-02         3           0.0
10   34  2009-01-02         3          -2.0
11   34  2009-01-03         5           NaN
12   34  2009-01-03         6          -2.0
13   34  2009-01-03         8           NaN

推荐阅读