微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

从 Pandas 数据帧中的序列中查找缺失的数字

如何解决从 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”列中缺少值。

  1. 对于 1029,我们缺少 2020 年的月份值 7,8,9 和 2021 年的 1,2
  2. 对于 1050,我们缺少 2020 年的月份值 9、10、11、12 和 2021 年的月份值 1,2
  3. 对于 1079,我们缺少 2020 年的月份值 5、6、7、8、9、10、11、12 和 2021 年的 1 个
  4. 对于 10810,我们缺少 2020 年的月份值 4、5、6、7、8、9、10、11、12 和 2021 年的 2 个

我是熊猫的新手。我正在尝试构建一个处理上述缺失值的逻辑。当缺失的月份和年份值插入到数据中时,'uniquecode1' 和 'name' 应该从它们各自的组值中复制,'Sale' 的值应该是 0 或 NaN。

有人可以帮我在 Pandas 中编写代码吗? 让我知道您可能需要哪些其他详细信息。

解决方法

您可以将带有 yearmonth 转换为日期时间,然后将所有缺失的组合与 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 举报,一经查实,本站将立刻删除。