如何解决从 Pandas 数据帧中的序列中查找缺失的数字
我的数据框中有以下数据:
uniquecode1 year month Name Sale
1029 2020 5 ABC 10
1029 2020 6 ABC 20
1029 2020 10 ABC 30
1029 2020 11 ABC 35
1029 2020 12 ABC 38
1050 2020 4 DEF 39
1050 2020 5 DEF 40
1050 2020 6 DEF 31
1050 2020 7 DEF 45
1050 2020 8 DEF 55
1079 2020 4 GHI 65
1079 2021 2 GHI 75
10810 2021 1 XYZ 85
假设我们坐在 21 年 3 月。对于 2021 年的上个月范围,我们将把自己限制在 Mar'21 减 1,即 2021 年 2 月
我们看到数据被分成不同的uniquecode1组。对于每一组 uniquecode1,我们在“month”列中缺少值。
- 对于 1029,我们缺少 2020 年的月份值 7,8,9 和 2021 年的 1,2
- 对于 1050,我们缺少 2020 年的月份值 9、10、11、12 和 2021 年的月份值 1,2
- 对于 1079,我们缺少 2020 年的月份值 5、6、7、8、9、10、11、12 和 2021 年的 1 个
- 对于 10810,我们缺少 2020 年的月份值 4、5、6、7、8、9、10、11、12 和 2021 年的 2 个
我是熊猫的新手。我正在尝试构建一个处理上述缺失值的逻辑。当缺失的月份和年份值插入到数据中时,'uniquecode1' 和 'name' 应该从它们各自的组值中复制,'Sale' 的值应该是 0 或 NaN。
有人可以帮我在 Pandas 中编写代码吗? 让我知道您可能需要哪些其他详细信息。
解决方法
您可以将带有 year
的 month
转换为日期时间,然后将所有缺失的组合与 DataFrame.set_index
Series.unstack
与新的 0
添加到不存在的值和 {{ 3}} 和 DataFrame.stack
用于原始格式:
df['dates'] = pd.to_datetime(df[['year','month']].assign(day=1))
df = (df.set_index(['uniquecode1','Name','dates'])['Sale']
.unstack(fill_value=0)
.stack()
.reset_index(name='Sale'))
print (df.head(10))
uniquecode1 Name dates Sale
0 1029 ABC 2020-04-01 0
1 1029 ABC 2020-05-01 10
2 1029 ABC 2020-06-01 20
3 1029 ABC 2020-07-01 0
4 1029 ABC 2020-08-01 0
5 1029 ABC 2020-10-01 30
6 1029 ABC 2020-11-01 35
7 1029 ABC 2020-12-01 38
8 1029 ABC 2021-01-01 0
9 1029 ABC 2021-02-01 0
最后添加年份和月份:
df = df.assign(year = df['dates'].dt.year,month = df['dates'].dt.month)
print (df.head())
uniquecode1 Name dates Sale year month
0 1029 ABC 2020-04-01 0 2020 4
1 1029 ABC 2020-05-01 10 2020 5
2 1029 ABC 2020-06-01 20 2020 6
3 1029 ABC 2020-07-01 0 2020 7
4 1029 ABC 2020-08-01 0 2020 8
但不幸的是缺少09-2020
,因此有必要添加Series.reset_index
:
df['dates'] = pd.to_datetime(df[['year','month']].assign(day=1))
mux = pd.date_range(df['dates'].min(),df['dates'].max(),freq='MS',name='dates')
#for add maximum manaully
#mux = pd.date_range(df['dates'].min(),'2021-03-01',name='dates')
df = (df.set_index(['uniquecode1','dates'])['Sale']
.unstack(fill_value=0)
.reindex(mux,axis=1,fill_value=0)
.stack()
.reset_index(name='Sale')
)
df = df.assign(year = df['dates'].dt.year,month = df['dates'].dt.month)
print (df.head(10))
uniquecode1 Name dates Sale year month
0 1029 ABC 2020-04-01 0 2020 4
1 1029 ABC 2020-05-01 10 2020 5
2 1029 ABC 2020-06-01 20 2020 6
3 1029 ABC 2020-07-01 0 2020 7
4 1029 ABC 2020-08-01 0 2020 8
5 1029 ABC 2020-09-01 0 2020 9
6 1029 ABC 2020-10-01 30 2020 10
7 1029 ABC 2020-11-01 35 2020 11
8 1029 ABC 2020-12-01 38 2020 12
9 1029 ABC 2021-01-01 0 2021 1
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。