Python pandas dataframe 从上一行和 groupby Months,year 获取值

Python pandas dataframe get value from previous row and groupby Months,year

我已经完成了在数据框中获取前一行值的工作。

groupby_result = df.groupby([df['DateAssigned'].dt.strftime('%m').rename('Month')]).agg({'count'}).cumsum().reset_index()

上面几行给我这样的结果

 Month   DateAssigned  DateCompleted        
  05        1             0

  06        18            4

因此代码获取仅存在的月份的累积值。我希望即使一个月没有记录也能结转累积值。

我的预期结果:

Month   DateAssigned   DateCompleted   diff
05            1             0           0
06           18             4           17
07           18             4           0
08           20             4           2

第 4 列 diff 只是为了更好地解释事情

让我解释一下我的要求 - 第 7 个月没有任何价值,但它应该从上个月(第 6 个月)获取值并将该值结转到第 8 个月

数据框供参考:

DateAssigned DateCompleted month

2020-06-18    2020-06-19  2020-06-18
2020-06-18           NaT  2020-06-18
2020-06-19           NaT  2020-06-19
2020-06-18    2020-06-18  2020-06-18
2020-06-23           NaT  2020-06-23
2020-06-04           NaT  2020-06-04      
2020-06-18           NaT  2020-06-18
2020-06-18    2020-06-18  2020-06-18
2020-06-05           NaT  2020-06-05
2020-06-18    2020-06-18  2020-06-18
2020-06-05           NaT  2020-06-05
2020-06-05           NaT  2020-06-05
2020-06-17           NaT  2020-06-17
2020-06-18           NaT  2020-06-18
2020-06-17           NaT  2020-06-17
2020-06-18           NaT  2020-06-18
2020-06-04           NaT  2020-06-04
2020-06-05           NaT  2020-06-05

尝试使用填充方法。如果值为空或 NaN,这将向前填充先前的值。

df.fillna(method='ffill')

这应该可以,使用适当的索引使其适应您的实际数据帧

df.groupby(df["DateAssigned"].dt.month.rename("Month")).count().cumsum().reindex([5,6,7,8]).ffill().reset_index()

使用 'shift()' 与分组和计数的 DF 计算差异。输出示例是我自己创建的任意结果,你可以自己替换。

df["DateAssigned"] = pd.to_datetime(df["DateAssigned"])
df["DateCompleted"] = pd.to_datetime(df["DateCompleted"])
df = df.groupby(df["DateAssigned"].dt.month.rename("Month")).count()
df['diff'] = df['DateAssigned']-df['DateAssigned'].shift()

df

DateAssigned    DateCompleted   month   diff
Month               
5       1   0   1   NaN
6       18  4   18  17.0
7       9   2   9   -9.0
8       12  2   12  3.0