这是一个示例数据集:
df = pd.DataFrame({'Date': ['11-9-2019', '11-9-2020', '11-8-2019', '15-5-2020'],
'name': ['Allen', 'Allen', 'David', 'David'],
'Grade': [50, np.nan, 60, np.nan],
'code': [3352326, np.nan, 22233467, np.nan]})
df['Date'] = pd.to_datetime(df['Date'])
df
我想做的是按"名称"列(例如:Allen(过滤最新日期。但是,所有信息都在最早日期的行中(例如:等级、代码(,最新日期的行都缺少数据。我希望结果只显示具有最新日期的行,但也希望将信息从具有最早日期的行移动到具有最晚日期的行。就像下面的结果一样。
df1 = pd.DataFrame({'Date': ['11-9-2020', '15-5-2020'],
'name': ['Allen', 'David'],
'Grade': [50, 60],
'code': [3352326, 22233467]})
df1['Date'] = pd.to_datetime(df1['Date'])
df1
我不确定这是否可能,也找不到相关的结果。提前感谢!
如果实际值总是组的第一行,您可以尝试:
>>> df.groupby('name').first().reset_index()
name Date Grade code
0 Allen 2019-11-09 50.0 3352326.0
1 David 2019-11-08 60.0 22233467.0
>>>
如果它们不总是第一个,你可以尝试:
>>> df.groupby('name').apply(lambda x: x.apply(lambda y: y.dropna().tolist()).iloc[0]).rename_axis('').reset_index().drop('', axis=1)
Date Grade code name
0 2019-11-09 50.0 3352326.0 Allen
1 2019-11-08 60.0 22233467.0 David
>>>
尝试:
df[['Grade','code']]=df[['Grade','code']].fillna(method='ffill')
df_out=df.groupby('name').agg('last').reset_index()
输出:
df_out
Out[32]:
name Date Grade code
0 Allen 2020-11-09 50.0 3352326.0
1 David 2020-05-15 60.0 22233467.0