我遇到一种情况,我需要对数据进行透视处理,以获取最新的和最近的条目基础的日期字段。我的数据框看起来像:
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
答案 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
(包含每个组的最大日期的行)并使用.append
到m-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