【发布时间】:2019-10-08 07:46:58
【问题描述】:
我有一个如下所示的数据框:
我想从那一年的最大值继续填充 NaN(即根据每年的最大值递增)。
这就是我想要实现的目标:
我知道如何将这样的东西分别应用于每一年的唯一方法是在 for 循环中为每一年创建单独的数据框,然后将它们重新附加在一起。
#data
d = {'year': {0: 2016,
1: 2016,
2: 2016,
3: 2016,
4: 2017,
5: 2017,
6: 2017,
7: 2017,
8: 2018,
9: 2018,
10: 2018},
'id': {0: 1015.0,
1: 1016.0,
2: nan,
3: nan,
4: 1035.0,
5: 1036.0,
6: nan,
7: nan,
8: 1005.0,
9: nan,
10: nan}}
# list of years
years = [2016,2017,2018]
# create dataframe
df = pd.DataFrame(d)
# create list that I will append data frames too
l = []
for x in years:
# create a dataframe for each year
df1 = df[df['year']==x].copy()
# fill nans with max value plus 1
df1['id'] = df1['id'].fillna(lambda x: x['id'].max() + 1)
# add dataframe to list
l.append(df1)
# concat list of dataframes
final = pd.concat(l)
这会将 nans 替换为以下文本:
函数位于 0x000002201F43CB70
我也尝试在我的 for 循环中使用它:
df1['id'] = df1['id'].apply(lambda x: x['id'].fillna(x['id'].max() +1))
但我得到一个错误:
TypeError: 'float' object is not subscriptable
【问题讨论】:
-
df.interpolate 可能会有所帮助......只是还没有弄清楚如何按年份分组使用它
-
@Will 您可以使用this answer 与 df.interpolate 和 group by 结合。但我不确定如何通过插值实现最大值+1。
标签: python