熊猫枢轴计算最大日期与秒至最大日期之间的差异

时间:2020-07-22 20:17:05

标签: python-3.x pandas pivot pivot-table aggregate

我遇到一种情况,我需要对数据进行透视处理,以获取最新的和最近的条目基础的日期字段。我的数据框看起来像:

State   country      Date             confirmed deaths  recover
  A         C     1/22/20             1         0       0
  A         C     1/23/20             1         0       0
  A         C     1/24/20             15        0       0
  A         C     1/25/20             39        0       0
  B         C     1/26/20             60        0       0
  B         C     1/27/20             70        0       0
  B         C     1/28/20            106        0       0
  B         C     1/29/20            152        2       0
  B         C     1/30/20            200        2       0

和我想要的输出应该是这样的: 因此,新的已确认列,死亡和恢复应基于Max(Date)获取值,该值对于状态A为1/25/20,对于状态B为1/30/20 而newcases,newdeaths,newrecover应该是“最大日期”值的差-次于最大日期值。

For example for state A new cases = 39-15= 24, newdeaths = 0-0=0 , newrecover = 0-0=0

我需要每天更改一次,所以在最高日期有39例,在第二个日期是第二个。这应该是动态的,因为它需要每天获取

State   country   confirmed deaths  recover      newcases     newdeaths    newrecover
  A        C           39       0        0       24           0             0
  B        C           200      2        0       48           2             0

2 个答案:

答案 0 :(得分:1)

sort_values(按日期升序)和groupby(日期)并提取每个组中的最后一个值。加入另一个groupby日期,从每个组的最后一个值中减去第二个最后一个值。

链式解决方案

 df.groupby('State').tail(1).drop(columns=['Date']).merge(df.sort_values(by='Date', ascending=True).groupby('State')\
[['confirmed', 'deaths', 'recover']].apply(lambda s:(s.iloc[-1].sub(s.iloc[-2])))\
    .reset_index().rename(columns={'confirmed':'newcases','deaths':\
            'newdeaths','recover':'newrecover'}), how='left', on='State')

分步解决方案

g=df.groupby('State').tail(1).drop(columns=['Date'])

g1=df.sort_values(by='Date', ascending=True).groupby('State')\
[['confirmed', 'deaths', 'recover']].apply(lambda s:(s.iloc[-1].sub(s.iloc[-2])))\
    .reset_index().rename(columns={'confirmed':'newcases','deaths':\
            'newdeaths','recover':'newrecover'})


newdf=g.merge(g1, how='left', on='State')


   State country  confirmed  deaths  recover  newcases  newdeaths  newrecover
0     A       C         39       0        0        24          0           0
1     B       C        200       2        0        48          0           0 

   newrecover  
0           0  
1           0  

答案 1 :(得分:1)

一种方法是使用m创建掩码idxmax,以返回date的一系列最大索引。然后,您可以创建一个分组对象gb作为过滤m的基础,方法是将其传递到.loc(包含每个组的最大日期的行)并使用.appendm-1(每组包含第二高日期的行)。然后,可以将此groupby对象库与相关列(例如.diff())上的df['new cases'] = gb['confirmed'].diff()一起使用。

m = df.reset_index().groupby(['State', 'country'])['index'].idxmax()
gb = df.loc[m].append(df.loc[m-1]).sort_index().groupby('State')
df['newcases'] = gb['confirmed'].diff()
df['newdeaths'] = gb['deaths'].diff()
df['newrecover'] = gb['recover'].diff()
df = df.dropna().drop('Date', axis=1)
df

输出:

    State   country     confirmed   deaths  recover newcases    newdeaths   newrecover
3   A       C           39          0       0       24.0        0.0         0.0
8   B       C           200         2       0       48.0        0.0         0.0