在数据帧的数月至数月之间,我丢失了很多数据,如下所示:
Year Month State Value
1969 12 NJ 5500
1969 12 NY 6418
1970 8 IL 10093
1970 12 WI 6430
1970 7 NY 6140
1971 10 IL 10093
1971 6 MN 6850
1971 3 SC 7686
1972 12 FL 8772
2016 1 NJ 9000
对于每个州,我需要填写从年初开始直到2018年的所有缺失数据,但是唯一存在的数据主要是在1969年至1990年之间,所以我只需要填写空白即可。 / p>
所需的输出(对于NJ,但所有状态都需要)为:
Year Month State Value
1969 12 NJ 5500
1970 1 NJ 5500
1970 2 NJ 5500
1970 3 NJ 5500
1970 4 NJ 5500
1970 5 NJ 5500
1970 6 NJ 5500
.
.
1970 12 NJ 5500
.
.
2010 1 NJ 5500
2010 2 NJ 5500
2010 3 NJ 5500
.
.
2018 1 NJ 9000
我尝试将月份转换为1-12个月的分类值,重新组合并重置索引,然后使用ffill将值划分为新创建的列索引,例如:
df['Month'] = pd.Categorical(df['Month'], categories=range(1, 13))
df = df.groupby(['State', 'Year', 'Month']).first().reset_index()
df['Value'] = df.groupby('Region')['Value'].ffill()
但是此方法为我提供了NaN值,例如:
State Year Month Value
NJ 1969 12 5500.0
NJ 1970 1 nan
NJ 1970 2 nan
NJ 1970 3 nan
.
.
NJ 2016 1 9000.0
我无法理解这种方法为何能奏效,因为我已经在具有实际结果的其他数据上对其进行了测试。
答案 0 :(得分:1)
对所有花时间纠正此问题的人表示抱歉。这只是一个偶然的错误分组的简单问题。
我以前是根据状态变量的集合(而不是国家本身)创建的'Region'
列。
因此需要澄清:
df['Value'] = df.groupby('Region')['Value'].ffill()
需要更改为:
df['Value'] = df.groupby('State')['Value'].ffill()
此方法正常工作。